From 82e7e75573ec9429b2b3b9c136f8d08d4debe814 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 15 Jun 2026 11:37:14 -0400 Subject: [PATCH 1/2] docs CI: re-clone OrdinaryDiffEq fresh in env setup (drop stale dev checkout) The master Documentation build failed at "Set up environment" with `empty intersection between OrdinaryDiffEq@6.111.0 and project compatibility 7`. `Pkg.develop("OrdinaryDiffEq")` reuses an existing `~/.julia/dev/OrdinaryDiffEq` rather than re-cloning, and the self-hosted runner had a stale 6.111.0 checkout left by an earlier run, which conflicts with the docs `OrdinaryDiffEq = "7"` compat. OrdinaryDiffEq master is 7.0.0, so a fresh clone resolves it. Remove any stale dev checkout before `Pkg.develop` so master is always cloned fresh, making the build robust to leftover runner state. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/Documentation.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/Documentation.yml b/.github/workflows/Documentation.yml index 59c0c67e7..04b586607 100644 --- a/.github/workflows/Documentation.yml +++ b/.github/workflows/Documentation.yml @@ -32,6 +32,12 @@ jobs: Pkg.develop(PackageSpec(path=pwd())) Pkg.instantiate() println("--- Adding OrdinaryDiffEq from master") + # Drop any stale dev checkout a previous run left in ~/.julia/dev so the + # current master is cloned fresh; a stale checkout can pin an old version + # that conflicts with the docs [compat] (e.g. OrdinaryDiffEq 6.x vs "7"). + let p = joinpath(Pkg.devdir(), "OrdinaryDiffEq") + isdir(p) && rm(p; recursive = true, force = true) + end Pkg.develop("OrdinaryDiffEq") env: DATADEPS_ALWAYS_ACCEPT: true From bd1f6b5ebbb9d61ed2d77af391f10724431ca66c Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 15 Jun 2026 12:39:44 -0400 Subject: [PATCH 2/2] docs: fix AlgebraicMultigrid preconditioner example + linkcheck failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The full Documentation build (now that env-setup is fixed) failed on two things: 1. `:example_block` — the AlgebraicMultigrid preconditioner blocks in advanced_ode_example.md crash with `ArgumentError: invalid argument #4 to LAPACK call` (gesdd!). The runner resolves AlgebraicMultigrid v1.x, whose default `Pinv` coarse solver forms a dense pseudo-inverse via SVD that fails on the non-SPD `W = I - γJ`. Use a direct sparse-LU coarse solver instead (`coarse_solver = AlgebraicMultigrid.LinearSolveWrapper(LS.UMFPACKFactorization())`), which exists in both AMG 1.x and 2.x and avoids the SVD path entirely. 2. `:linkcheck` — add two URLs to `linkcheck_ignore`: - github.com/SciML/LinearSolve.jl (linkcheck got HTTP 429 / rate-limited) - mathworks.com/.../nonnegative-ode-solution.html (HTTP 403 / bot-blocked, like the other mathworks links already ignored). Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/make.jl | 2 ++ docs/src/tutorials/advanced_ode_example.md | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/make.jl b/docs/make.jl index 4fc6d1711..a90214ed4 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -174,6 +174,8 @@ makedocs( "https://docs.sciml.ai/DiffEqDocs/stable/features/dae_initialization/", "https://www.sciencedirect.com/science/article/pii/S0096300304009683", "https://github.com/JuliaDiff/FiniteDiff.jl", + "https://github.com/SciML/LinearSolve.jl", + "https://www.mathworks.com/help/matlab/math/nonnegative-ode-solution.html", ], doctest = false, clean = true, warnonly = [:missing_docs, :docs_block], diff --git a/docs/src/tutorials/advanced_ode_example.md b/docs/src/tutorials/advanced_ode_example.md index 7d8ec0447..777509d5e 100644 --- a/docs/src/tutorials/advanced_ode_example.md +++ b/docs/src/tutorials/advanced_ode_example.md @@ -273,7 +273,11 @@ which is more automatic. The setup is very similar to before: ```@example stiff1 import AlgebraicMultigrid function algebraicmultigrid(W, p) - Pl = AlgebraicMultigrid.aspreconditioner(AlgebraicMultigrid.ruge_stuben(convert(AbstractMatrix, W))) + A = convert(AbstractMatrix, W) + # Use a direct (LU) coarse solver: AlgebraicMultigrid's default `Pinv` coarse solver + # forms a dense pseudo-inverse via SVD, which errors on the non-SPD `W = I - γJ`. + Pl = AlgebraicMultigrid.aspreconditioner(AlgebraicMultigrid.ruge_stuben(A; + coarse_solver = AlgebraicMultigrid.LinearSolveWrapper(LS.UMFPACKFactorization()))) Pl, LinearAlgebra.I end @@ -290,7 +294,8 @@ function algebraicmultigrid2(W, p) A = convert(AbstractMatrix, W) Pl = AlgebraicMultigrid.aspreconditioner(AlgebraicMultigrid.ruge_stuben(A, presmoother = AlgebraicMultigrid.Jacobi(rand(size(A, 1))), - postsmoother = AlgebraicMultigrid.Jacobi(rand(size(A, 1))))) + postsmoother = AlgebraicMultigrid.Jacobi(rand(size(A, 1))), + coarse_solver = AlgebraicMultigrid.LinearSolveWrapper(LS.UMFPACKFactorization()))) Pl, LinearAlgebra.I end