Skip to content

Uniformize monorepo structure to OrdinaryDiffEq canonical style#13

Merged
ChrisRackauckas merged 12 commits into
SciML:mainfrom
ChrisRackauckas-Claude:uniformize-monorepo-structure
Jun 8, 2026
Merged

Uniformize monorepo structure to OrdinaryDiffEq canonical style#13
ChrisRackauckas merged 12 commits into
SciML:mainfrom
ChrisRackauckas-Claude:uniformize-monorepo-structure

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor

This PR fully uniformizes the repository to the OrdinaryDiffEq.jl canonical monorepo style.

Canonicalization done

Root track

  • Converted the bare [workspace] root into a real package Project.toml (name/uuid/version, [deps]+[sources] to lib/<Name>, [compat], [extras]+[targets].test). The umbrella now @reexports OUQBase, making it a buildable, meaningful package and giving a traversable [sources] path graph for sublibrary matrix discovery.
  • Added a GROUP-dispatched root CI.yml (matrix over the root's own Core group on lts/1.11/1/pre; no hardcoded sublibrary GROUP rows — sublibs are covered by the SublibraryCI project model).
  • Added a root Downgrade.yml calling downgrade.yml@v1 (no allow-reresolve).
  • Added root test/runtests.jl with a _detect_sublibrary_group dispatcher: if GROUP names lib/<X> it activates that sublib, develops its [sources] on Julia < 1.11, sets OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP, and Pkg.tests it; otherwise it runs the root's own @safetestset groups (umbrella-load smoke test).

Sublibraries

  • Deleted lib/CanonicalMoments/test/Project.toml and lib/OUQBase/test/Project.toml; folded their deps into [extras] + [targets].test of each package Project.toml.
  • Removed OUQBase's [workspace] test-subproject wiring.
  • Dropped TestItemRunner from CanonicalMoments test deps (unused; tests already use SafeTestsets).
  • Rewrote every sublib test/runtests.jl to read OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP and @safetestset-include per group (Core), mirroring OrdinaryDiffEq sublib runtests. DiscreteMeasures' test body moved to discrete_measures_tests.jl so its runtests is a pure dispatcher.

Workflows

  • SublibraryCI.yml: added with: { group-env-name: OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP, check-bounds: auto }.
  • DowngradeSublibraries.yml: added group-env-name/group-env-value: Core, skip list of siblings (CanonicalMoments,DiscreteMeasures,OUQBase) + stdlibs; auto-discovers lib/*.
  • dependabot.yml: dropped the removed test/ subprojects.

The chosen group-env-name OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP is threaded consistently: caller workflows == every sublib runtests == the root dispatcher.

Verified locally (isolated depot, Julia 1.11.9)

  • TOML-parsed every changed Project.toml; confirmed every [targets].test dep appears in [extras].
  • Confirmed zero test/Project.toml, zero @testitem/ReTestItems/TestItemRunner, zero [workspace] remain; no @test_broken/@test_skip added; no [compat] floor lowered (all julia floors 1.10).
  • YAML-parsed all four changed/added workflows.
  • Instantiated the root umbrella and two representative sublibs (DiscreteMeasures, CanonicalMoments).
  • Ran the new @safetestset dispatch for two sublib Core groups:
    • DiscreteMeasures Core: Discrete Measures | 45 45 passed.
    • CanonicalMoments Core: Orthogonal Polynomial Roots | 11 11 and Moment Sequence | 260 260 passed.
  • Ran the root's smallest group via Pkg.test() with GROUP=Core: Umbrella Load | 5 5 passed.
  • Exercised the root dispatcher end-to-end with GROUP=DiscreteMeasures: it activated lib/DiscreteMeasures and ran its suite (45 45 passed).
  • Ran Runic on all changed/added .jl files (idempotent, clean).

What CI must confirm

  • The OUQBase Core group (Flood Problem solve) on the full matrix — locally OUQBase pulls the ModelingToolkit/Optimization stack; its group was not run end-to-end here, only instantiated transitively via the root. CI's SublibraryCI project model will run it.
  • Downgrade resolution for all three sublibs and the root on the floor versions.
  • Behavior on Julia LTS (1.10) and pre.

Ignore until reviewed by @ChrisRackauckas.

🤖 Generated with Claude Code

ChrisRackauckas and others added 12 commits June 7, 2026 16:15
Make the repo match the OrdinaryDiffEq.jl canonical monorepo invariants:

Root track:
- Convert the bare [workspace] root into a real package Project.toml
  (name/uuid/version, [deps]+[sources] to lib/<Name>, [compat],
  [extras]+[targets].test). The umbrella now @reexport-s OUQBase so it
  is a buildable, meaningful package and the [sources] path graph is
  traversable by sublibrary matrix discovery.
- Add a GROUP-dispatched root CI.yml (matrix over the root's own Core
  group; no hardcoded sublibrary rows) and a root Downgrade.yml calling
  downgrade.yml@v1 (no allow-reresolve).
- Add root test/runtests.jl with a _detect_sublibrary_group dispatcher:
  if GROUP names lib/<X> it activates and Pkg.test-s that sublib under
  OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP; otherwise runs the root's
  own @safetestset groups (umbrella load smoke test).

Sublibraries:
- Delete lib/CanonicalMoments/test/Project.toml and
  lib/OUQBase/test/Project.toml; fold their deps into [extras] +
  [targets].test in each package Project.toml.
- Remove OUQBase's [workspace] test-subproject wiring.
- Drop TestItemRunner from CanonicalMoments test deps (unused).
- Rewrite every sublib test/runtests.jl to read
  OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP and @safetestset-include
  per group (Core), mirroring OrdinaryDiffEq sublib runtests.

Workflows:
- SublibraryCI.yml: thread group-env-name
  OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP + check-bounds: auto.
- DowngradeSublibraries.yml: add group-env-name/group-env-value Core,
  skip list of siblings + stdlibs; auto-discovers lib/*.
- dependabot.yml: drop the removed test/ subprojects.

No [compat] floors lowered; no tests skipped/broken/loosened.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Match SciML/OrdinaryDiffEq.jl casing: the sublibrary test/runtests.jl
default group and comparison strings used all-caps "ALL"; canonicalize
to Title-case "All" so they line up with the umbrella runner, which
passes "Core"/"All" verbatim through OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP.

Casing-only change; dispatch logic, env var names, and fallback chains
are unchanged.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Rename LICENSE->LICENSE.md (root + add to 3 sublibs), rename
_typos.toml->.typos.toml with [default.extend-words], add .codecov.yml
(comment:false), and complete .gitignore to match OrdinaryDiffEq canonical
form. Fix genuine source/comment typos surfaced by typos so SpellCheck stays
green without silencing real misspellings.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add canonical component READMEs (Zulip + Global Docs + ColPrac + SciML Style
badges, "component of the OptimalUncertaintyQuantification.jl monorepo"
wording) to each lib/* sublibrary, and declare each sublibrary's real test
groups in test/test_groups.toml. All three sublibraries only have a Core
group (no QA/Aqua tests exist), tested across lts/1.11/1/pre.

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

Add the central @v1 Documentation.yml and DocPreviewCleanup.yml callers and a
canonical IntegrationTest (Downstream.yml) matching OrdinaryDiffEq's embedded
form (empty matrix no-op until registered downstream consumers exist). Add the
root TagBot-OptimalUncertaintyQuantification job alongside the existing
subpackages matrix to match the canonical TagBot structure.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add event-split Julia depot cache (push read+write, PR restore-only with
matching restore-keys) and the JULIA_DEPOT_PATH pin to the root CI.yml to
match OrdinaryDiffEq's canonical CI. Add umbrella docs/ wiring: docs/Project.toml
(umbrella + sublibraries via [sources] with [compat]), docs/make.jl, docs/pages.jl,
and docs/src/index.md.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add ADD-only [compat] entries for previously unbounded dependencies:
CanonicalMoments weakdeps ChainRulesCore ("1") and ForwardDiff ("0.10, 1");
OUQBase deps CanonicalMoments/DiscreteMeasures ("0.1"), Optimization ("5"),
PolynomialRoots ("1"), and SymbolicUtils ("3"). Bounds are set at or below the
versions the umbrella and sublibrary test targets currently resolve (verified by
instantiate/resolve on Julia 1.11), so no existing resolve is constrained out and
no floor is lowered. CanonicalMoments Core tests pass (271/271) under the new bounds.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mkpath the docs/src/assets directory in make.jl before cp so the documentation
build does not error when the directory is absent.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Restructure the root umbrella test and all three sublibrary test suites
(CanonicalMoments, DiscreteMeasures, OUQBase) into per-group test/<Group>/
folders, matching the OrdinaryDiffEq/NonlinearSolve canonical GROUP-FOLDER
layout. Every test now lives in exactly one group folder:

  - test/Core/umbrella_load.jl
  - lib/CanonicalMoments/test/Core/{orthopoly_roots,moment_sequence,stenger_setup}.jl
  - lib/DiscreteMeasures/test/Core/discrete_measures_tests.jl
  - lib/OUQBase/test/Core/FloodProblem/*.jl

All include() paths in the dispatchers are updated to the Core/ prefix.
No tests are added, removed, skipped, or loosened; the same @safetestset
set runs from the new paths. All sublibs run only the Core group (no QA
tools / no dep-adding groups), so no per-group Project.toml is needed and
Core remains part of the base/All run.

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

Drop the non-canonical "1.11" entry from every sublibrary's [Core] test group
(CanonicalMoments, DiscreteMeasures, OUQBase) and from the root CI.yml version
matrix, so the base/Core groups run the canonical [lts, 1, pre] set matching the
OrdinaryDiffEq/NonlinearSolve monorepo convention. There are no dep-adding,
QA, or GPU groups in this repo, so no group is excluded from All and no
per-group Project.toml or runner matrix is introduced.

Also completes the test/<Group>/ restructuring by updating the include() paths
in each runtests.jl dispatcher to the Core/ prefix (the prior commit moved the
files but the path edits land here). No tests are added, removed, skipped, or
loosened; no compat floors are lowered.

Verified with the centralized compute_affected_sublibraries.jl --projects-matrix
script: it emits exactly Core on [lts, 1, pre] for each of the three sublibs.

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

The OUQBase test/runtests.jl only ever included Core/FloodProblem/Q_only.jl;
the other four flood-problem files were unreachable since before the monorepo
restructure (orphaned upstream). 2D_independent.jl, full_independent.jl, and
full_dependent.jl only build OUQSystem fixtures (pushed into Main-scoped
problem dictionaries via `isdefined(Main, ...)` guards), and
test_canonical_moments.jl consumed those dictionaries through an
`include` of a Problems/all_problems.jl aggregator that never existed in the
repo (and whose relative path was off by one directory level).

Reconstruct the missing test/Problems/all_problems.jl fixture aggregator: it
defines the eight problem dictionaries and includes each FloodProblem setup
file so they populate it. Fix the include path in test_canonical_moments.jl to
reach the aggregator under the new test/Core/ layout, and run both the Q-only
smoke solve and the canonical-moments objective assertion at top level in Main
(so the Main-scoped fixture dictionaries are visible). Guard Q_only.jl's
expensive trailing solve behind a LOAD_OUQ_PROBLEMS_FIXTURE flag so it runs
once from its own group entry rather than again when loaded as a fixture.

The canonical-moments objective test (@test isapprox(obj_val, 0.6897,
atol=0.01)) now runs and passes; all four formerly-orphaned files are exercised
as part of the Core group that the sublibrary CI matrix runs on [lts, 1, pre].

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the verbose TagBot.yml with the canonical SciML thin caller
(tagbot.yml@v1). The tagbot-subpackages matrix is omitted because none
of the lib/ sublibraries (CanonicalMoments, DiscreteMeasures, OUQBase)
are registered in the General registry yet, and TagBot errors on
unregistered subdirs.

Remove the hand-listed skip: inputs (stdlibs + in-repo sublibs) from
the Downgrade.yml and DowngradeSublibraries.yml callers; the centralized
workflows now auto-populate skip. Drop julia-version: "1.10" to take the
central 'lts' default (the minimum-supported floor).

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 8, 2026 09:30
@ChrisRackauckas ChrisRackauckas merged commit b4b1979 into SciML:main Jun 8, 2026
10 of 11 checks passed
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