From 910692a49dcaddad71b7953435e6d0e0a8123118 Mon Sep 17 00:00:00 2001 From: "Chris Rackauckas (Claude)" Date: Tue, 9 Jun 2026 21:54:51 -0400 Subject: [PATCH 1/2] Remove ParametricMCPs test dependency to unblock dependency updates ParametricMCPs (including its latest release, 0.1.17) caps ForwardDiff at 0.10 through a weak dependency, which makes it impossible to resolve a test environment containing NonlinearSolve >= 4.17 (requires ForwardDiff 1), NNlib >= 0.9.32, or CUDA >= 6. This is what made the GPU CI jobs on the dependabot update PR fail at version resolution, and it silently held the CPU test jobs back on DiffEqBase 6 / OrdinaryDiffEq 6 / CUDA 5 / ForwardDiff 0.10. Dropping the ParametricMCPs comparison benchmark lets the test environment resolve the full updated stack (CUDA 6.1, DiffEqBase 7.5, OrdinaryDiffEq 7.0, Optimization 5.6, ForwardDiff 1.4, NonlinearSolve 4.19, SciMLSensitivity 7.112, SciMLBase 3.18). The ComplementaritySolve.jl side of the benchmark testset is kept since it exercises forward solves and Zygote adjoints for both in-place and out-of-place problems. Core, Applications, and QA test groups all pass locally against the updated stack with no source changes required. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Fable 5 --- test/Project.toml | 2 -- test/core/cpu/mcp.jl | 27 ++++----------------------- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/test/Project.toml b/test/Project.toml index 3902bb7..37612c4 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -15,7 +15,6 @@ Optimization = "7f7a1694-90dd-40f0-9382-eb1efda571ba" OptimizationOptimisers = "42dfb2eb-d2b4-4451-abcd-913932933ac1" OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" PATHSolver = "f5f7c340-0bb3-5c69-969a-41884d311d1b" -ParametricMCPs = "9b992ff8-05bb-4ea1-b9d2-5ef72d82f7ad" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" SciMLSensitivity = "1ed8b502-d754-442c-8d5d-10ac956f44a1" SimpleNonlinearSolve = "727e6d20-b764-4bd8-a329-72de5adea6c7" @@ -42,7 +41,6 @@ Optimization = "3, 4" OptimizationOptimisers = "0.2, 0.3" OrdinaryDiffEq = "6" PATHSolver = "1" -ParametricMCPs = "0.1" SafeTestsets = "0.1" SciMLSensitivity = "7" SimpleNonlinearSolve = "0.1, 1, 2" diff --git a/test/core/cpu/mcp.jl b/test/core/cpu/mcp.jl index 0c05945..56ff819 100644 --- a/test/core/cpu/mcp.jl +++ b/test/core/cpu/mcp.jl @@ -1,6 +1,5 @@ using BenchmarkTools, ComplementaritySolve, ComponentArrays, FiniteDifferences using ForwardDiff, NonlinearSolve, SimpleNonlinearSolve, StableRNGs, Test, Zygote -import ParametricMCPs rng = StableRNG(0) @@ -70,7 +69,10 @@ rng = StableRNG(0) @test ∂θ_zygote ≈ ∂θ_finitediff atol = 1.0e-3 rtol = 1.0e-3 end - @testset "Benchmarking against ParametricMCPs.jl" begin + # ParametricMCPs.jl was previously benchmarked here as well, but its latest + # release caps ForwardDiff at 0.10 (via a weak dependency), which is + # incompatible with NonlinearSolve >= 4.17, NNlib >= 0.9.32, and CUDA >= 6. + @testset "Benchmarking" begin u0 = randn(rng, Float64, 4) lb = Float64[-Inf, -Inf, 0, 0] ub = Float64[Inf, Inf, Inf, Inf] @@ -88,18 +90,6 @@ rng = StableRNG(0) return sum(abs2, sol.u) end - prob_ext = ParametricMCPs.ParametricMCP(f, lb, ub, length(θ)) - function loss_function_parametric_mcp(θ) - sol = ParametricMCPs.solve(prob_ext, θ) - return sum(abs2, sol.z) - end - - function loss_function_parametric_mcp_total(θ) - prob = Zygote.@ignore ParametricMCPs.ParametricMCP(f, lb, ub, length(θ)) - sol = ParametricMCPs.solve(prob, θ) - return sum(abs2, sol.z) - end - loss_function_path_oop = Base.Fix2(loss_function_oop, PATHSolverAlgorithm()) loss_function_nr_oop = Base.Fix2( loss_function_oop, @@ -121,15 +111,6 @@ rng = StableRNG(0) t₂ = @belapsed only(Zygote.gradient($loss_function, $θ)) @info "ComplementaritySolve.jl: $(loss_function)" fwd_time = t₁ with_adjoint_time = t₂ end - - for loss_function in ( - loss_function_parametric_mcp, - loss_function_parametric_mcp_total, - ) - t₁ = @belapsed $loss_function($θ) - t₂ = @belapsed only(Zygote.gradient($loss_function, $θ)) - @info "ParametricMCPs.jl: $(loss_function)" fwd_time = t₁ with_adjoint_time = t₂ - end end end end From 14e1bbc92e2b417d1eb58fa85688e7b27f2d135f Mon Sep 17 00:00:00 2001 From: "Chris Rackauckas (Claude)" Date: Wed, 10 Jun 2026 02:50:20 -0400 Subject: [PATCH 2/2] Raise compat lower bounds so Downgrade CI minimum versions are resolvable and testable The Downgrade workflow (added 2026-06-02 with the centralized workflows migration) has never passed: it resolves the manifest to the minimum versions allowed by [compat] and runs Pkg.test(allow_reresolve=false), and the old lower bounds (SciMLBase 1, NonlinearSolve 1, LinearSolve 2, Zygote 0.6, ...) were never mutually resolvable with the test dependencies, nor runtime-correct: - The source uses the SciMLOperators >= 1 FunctionOperator interface (5-arg matvec(w, v, u, p, t)). Any resolution with SciMLOperators 0.3/0.4 (i.e. LinearSolve 2.x or SciMLBase < 2.100) fails at runtime with MethodErrors in every FunctionOperator-based solve. - The minimal manifest pins SparseMatrixColorings 0.4.27, which forces CUDA 6; CUDA 6 needs NNlib >= 0.9.34 and DiffEqBase >= 6.215, which needs SciMLBase >= 2.143. - NNlib >= 0.9.32 requires ForwardDiff 1, and SciMLBase >= 2.102 requires Zygote >= 0.7 (>= 0.7.5 with ForwardDiff 1). - The test environment needs OrdinaryDiffEq >= 6.106 (DataStructures 0.19.5 / PreallocationTools 1.2 pins), which sets the floors for LinearSolve (3.61 via OrdinaryDiffEqDifferentiation 2.5+ with FastBroadcast 1.3), NonlinearSolve (4.12), SimpleNonlinearSolve (2.7), Polyester (0.7.18), FillArrays (1.13), PrecompileTools (1.2.1, since 1.3 is Julia 1.12+), and TruncatedStacktraces (1.4). - SciMLSensitivity needs >= 7.100 to work with FastBroadcast 1.3, which requires SciMLBase >= 2.147. All raised bounds only drop version combinations that could never have passed the test suite. Verified locally on Julia 1.10.11 with the workflow's downgrade resolution followed by Pkg.test(allow_reresolve=false): Core (212 pass), QA (5 pass), and Applications (41 pass) all green at the pinned minimum versions (SciMLBase 2.147.0, NonlinearSolve 4.12.0, LinearSolve 3.61.0, SimpleNonlinearSolve 2.9.0, SciMLOperators 1.22.0, Zygote 0.7.5, ForwardDiff 1.0.1, NNlib 0.9.34, FillArrays 1.13.0, Polyester 0.7.18, PATHSolver 1.4.0, CommonSolve 0.2.6, TruncatedStacktraces 1.4.0, PrecompileTools 1.2.1). test/Project.toml additionally allows CUDA 6, required by the pinned SparseMatrixColorings. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Fable 5 --- Project.toml | 28 ++++++++++++++-------------- test/Project.toml | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Project.toml b/Project.toml index 929df57..626bb1d 100644 --- a/Project.toml +++ b/Project.toml @@ -28,19 +28,19 @@ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" [compat] ArrayInterfaceCore = "0.1" ChainRulesCore = "1" -CommonSolve = "0.2" +CommonSolve = "0.2.6" ConcreteStructs = "0.2" -FillArrays = "1" -ForwardDiff = "0.10, 1" -GPUArraysCore = "0.1, 0.2" -LinearSolve = "2, 3" -NNlib = "0.8, 0.9" -NonlinearSolve = "1, 2, 3, 4" -PATHSolver = "1" -Polyester = "0.7" -PrecompileTools = "1" -SciMLBase = "1, 2, 3.1" -SimpleNonlinearSolve = "0.1, 1, 2" -TruncatedStacktraces = "1" -Zygote = "0.6, 0.7" +FillArrays = "1.13" +ForwardDiff = "1" +GPUArraysCore = "0.2" +LinearSolve = "3.61" +NNlib = "0.9.34" +NonlinearSolve = "4.12" +PATHSolver = "1.4" +Polyester = "0.7.18" +PrecompileTools = "1.2.1" +SciMLBase = "2.147, 3.1" +SimpleNonlinearSolve = "2.7" +TruncatedStacktraces = "1.4" +Zygote = "0.7.5" julia = "1.10" diff --git a/test/Project.toml b/test/Project.toml index 37612c4..71691f3 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -28,7 +28,7 @@ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" [compat] Aqua = "0.8" BenchmarkTools = "1" -CUDA = "4, 5" +CUDA = "4, 5, 6" ChainRulesCore = "1" ComponentArrays = "0.15" DiffEqBase = "6"