Uniformize monorepo structure to OrdinaryDiffEq canonical style#13
Merged
ChrisRackauckas merged 12 commits intoJun 8, 2026
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR fully uniformizes the repository to the OrdinaryDiffEq.jl canonical monorepo style.
Canonicalization done
Root track
[workspace]root into a real packageProject.toml(name/uuid/version,[deps]+[sources]tolib/<Name>,[compat],[extras]+[targets].test). The umbrella now@reexportsOUQBase, making it a buildable, meaningful package and giving a traversable[sources]path graph for sublibrary matrix discovery.CI.yml(matrix over the root's ownCoregroup onlts/1.11/1/pre; no hardcoded sublibrary GROUP rows — sublibs are covered by the SublibraryCI project model).Downgrade.ymlcallingdowngrade.yml@v1(noallow-reresolve).test/runtests.jlwith a_detect_sublibrary_groupdispatcher: ifGROUPnameslib/<X>it activates that sublib, develops its[sources]on Julia < 1.11, setsOPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP, andPkg.tests it; otherwise it runs the root's own@safetestsetgroups (umbrella-load smoke test).Sublibraries
lib/CanonicalMoments/test/Project.tomlandlib/OUQBase/test/Project.toml; folded their deps into[extras]+[targets].testof each packageProject.toml.OUQBase's[workspace]test-subproject wiring.TestItemRunnerfrom CanonicalMoments test deps (unused; tests already use SafeTestsets).test/runtests.jlto readOPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUPand@safetestset-include per group (Core), mirroring OrdinaryDiffEq sublib runtests. DiscreteMeasures' test body moved todiscrete_measures_tests.jlso its runtests is a pure dispatcher.Workflows
SublibraryCI.yml: addedwith: { group-env-name: OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUP, check-bounds: auto }.DowngradeSublibraries.yml: addedgroup-env-name/group-env-value: Core, skip list of siblings (CanonicalMoments,DiscreteMeasures,OUQBase) + stdlibs; auto-discoverslib/*.dependabot.yml: dropped the removedtest/subprojects.The chosen group-env-name
OPTIMALUNCERTAINTYQUANTIFICATION_TEST_GROUPis threaded consistently: caller workflows == every sublib runtests == the root dispatcher.Verified locally (isolated depot, Julia 1.11.9)
Project.toml; confirmed every[targets].testdep appears in[extras].test/Project.toml, zero@testitem/ReTestItems/TestItemRunner, zero[workspace]remain; no@test_broken/@test_skipadded; no[compat]floor lowered (all julia floors1.10).@safetestsetdispatch for two sublibCoregroups:Discrete Measures | 45 45passed.Orthogonal Polynomial Roots | 11 11andMoment Sequence | 260 260passed.Pkg.test()withGROUP=Core:Umbrella Load | 5 5passed.GROUP=DiscreteMeasures: it activatedlib/DiscreteMeasuresand ran its suite (45 45passed)..jlfiles (idempotent, clean).What CI must confirm
Coregroup (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.pre.🤖 Generated with Claude Code