Fix Julia 1.10 support and add downgrade CI#8
Conversation
DiscreteMeasures: replace two-arg `allequal(length, x)` (Julia >= 1.11 only) with `allequal(length.(x))`, which is semantically identical and works on Julia 1.10. The two-arg form MethodErrors on 1.10, breaking the LTS. CanonicalMoments: raise the IntervalArithmetic compat floor 0.16 -> 0.18. IntervalArithmetic 0.16-0.17 require RecipesBase <= 0.7 / pull ConstructionBase down, which is unsatisfiable with this package's Symbolics floor; 0.18 is the lowest version that resolves and passes. Kept the disjoint =0.20.9 range. Add .github/workflows/Downgrade.yml: matrix over the 3 workspace submodules (CanonicalMoments.jl, DiscreteMeasures.jl, OUQBase.jl) calling the reusable SciML downgrade workflow at julia-version 1.10, mirroring Tests.yml. Downgrade suite run locally at the compat floors on Julia 1.10: - DiscreteMeasures (IntervalArithmetic 0.16.0): PASS - CanonicalMoments (IntervalArithmetic 0.18.0, Symbolics 6.29.2): PASS - OUQBase (ModelingToolkit 9.69.0, SciMLBase 2.89.1, Symbolics 6.39.1, JuMP 1.23.6, DomainSets 0.7.15, Polynomials 4.0.13): PASS Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The strict (allow-reresolve: false) downgrade cannot reconcile this package's floored core deps against the latest-floating transitive SciML stack. allow-reresolve: true lets Pkg resolve a consistent set while still enforcing the floor [compat] pins set by julia-downgrade-compat. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The downgrade CI resolves each workspace submodule in isolation via julia-downgrade-compat, which cannot resolve sibling submodule deps (DiscreteMeasures, CanonicalMoments) since they are unregistered path deps -> "unknown package UUID". Declare them via [sources] so the action removes them for resolution and re-adds them to the manifest as path deps (the same mechanism SciML tests.yml@v1 relies on). Submodule floor bumps (verified resolvable + test-passing at floors on Julia 1.10, deps-mode, allow_reresolve=true): CanonicalMoments: - add [sources] DiscreteMeasures = ../DiscreteMeasures.jl - Polynomials: (none) -> "4" (0.5.0 lacked AbstractPolynomial export) - RecurrenceRelationships: (none) -> "0.2" - add julia/LinearAlgebra/Statistics/DiscreteMeasures floors OUQBase: - add [sources] CanonicalMoments + DiscreteMeasures path deps - SciMLBase: 2.89.1 -> 2.153 (2.89.1 held Optimization to 3.25.1, too old for the test stack's OptimizationBBO -> UndefVarError deduce_retcode; 2.153 lets OptimizationBBO/OptimizationBase/Optimization resolve consistently, matching the passing latest-CI set) Downgrade suite run locally at these floors: PASS - CanonicalMoments: Orthogonal Polynomial Roots 11/11, Moment Sequence 260/260 - OUQBase: FloodProblem solve pipeline completes (was failing on deduce_retcode) Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Downgrade CI fix for CanonicalMoments + OUQBaseRoot cause (both failures, identical):
Fix: declare sibling submodules via Once resolution worked, two genuine floor bugs surfaced and were fixed (lowest working bounds): CanonicalMoments (deps had no compat at all → floated to ancient versions):
OUQBase:
Local downgrade suite (Julia 1.10, deps-mode,
🤖 Generated with Claude Code |
Flip the Downgrade.yml caller from allow-reresolve: true to the strict SciML default (false). With false, julia-downgrade-compat resolves each workspace submodule's [deps] to their floors with transitive deps at LATEST, and Pkg.test must instantiate that exact set with NO reconciliation -- the rigorous downgrade that forces the declared [deps] floors to be genuinely compatible with the latest transitive ecosystem. Verified locally on Julia 1.10 (deps-mode, Pkg.test(allow_reresolve=false)) per matrix submodule -- ALL PASS at the existing floors, no floor raises needed beyond those already in this PR: - DiscreteMeasures.jl: 45/45 (DiscreteMeasure 8, ProductDiscreteMeasure 15, Expectation 3, Measure Restrictions 19) - CanonicalMoments.jl: Orthogonal Polynomial Roots 11/11, Moment Sequence 260/260 - OUQBase.jl: FloodProblem OptimizationBBO solve pipeline completes (best candidate [0.344441, 0.831005], fitness 0.1927), tests passed Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Switched downgrade to strict
|
| Submodule | Result |
|---|---|
DiscreteMeasures.jl |
PASS — 45/45 (DiscreteMeasure 8, ProductDiscreteMeasure 15, Expectation 3, Measure Restrictions 19) |
CanonicalMoments.jl |
PASS — Orthogonal Polynomial Roots 11/11, Moment Sequence 260/260 |
OUQBase.jl |
PASS — FloodProblem OptimizationBBO solve pipeline completes (best candidate [0.344441, 0.831005], fitness 0.1927) |
The floors added earlier in this PR (CanonicalMoments: Polynomials = "4", RecurrenceRelationships = "0.2", sibling [sources]; OUQBase: SciMLBase = "2.153", sibling [sources]) are exactly the floors that make the strict floor-direct / latest-transitive set resolve and test-pass, so flipping to false is clean.
Only .github/workflows/Downgrade.yml changed in this commit (allow-reresolve: true → false).
Ignore until reviewed by @ChrisRackauckas.
🤖 Generated with Claude Code
Summary
This PR restores Julia 1.10 (LTS) support and adds a downgrade-compatibility CI workflow for the three workspace submodules.
1. Julia 1.10 code fix (DiscreteMeasures)
DiscreteMeasures.jl/src/DiscreteMeasures.jlused the two-argument formallequal(length, x), which only exists on Julia >= 1.11. On Julia 1.10 (the SciML-required LTS) this throws aMethodError, so the package cannot even load/construct aDiscreteMeasure. Replaced withallequal(length.(x)), which is semantically identical (all support points share the same length) and works on 1.10.Verified on the 1.10 binary: the two-arg form
MethodErrors;allequal(length.(x))returns the same result (true for equal-length / scalar vectors, false otherwise).2. CanonicalMoments compat floor fix
IntervalArithmetic:"0.16 - 0.20, =0.20.9"->"0.18 - 0.20, =0.20.9". IntervalArithmetic 0.16-0.17 requireRecipesBase <= 0.7(and pullConstructionBasedown), which is unsatisfiable together with this package'sSymbolicsfloor. 0.18 is the lowest IntervalArithmetic that resolves and passes the suite. The disjoint=0.20.9range is preserved; no allowed version sits below the verified floor.DiscreteMeasuresandOUQBasefloors were already healthy on 1.10 (no compat change needed).3. Downgrade CI
Added
.github/workflows/Downgrade.yml: a matrix over[CanonicalMoments.jl, DiscreteMeasures.jl, OUQBase.jl]callingSciML/.github/.github/workflows/downgrade.yml@v1withjulia-version: "1.10",project: ${{ matrix.project }},projects: ${{ matrix.project }},secrets: inherit. Mirrors the existingTests.ymlmatrix shape.Local verification (Julia 1.10, isolated depot, compat pinned to floors)
All three submodules pass the downgrade suite at their compat floors on Julia 1.10:
🤖 Generated with Claude Code