Repository navigation
Keep sparse W sparsity patterns fixed across Jacobian value changes - #4683
Draft
ChrisRackauckas-Claude wants to merge 6 commits into
Draft
ChrisRackauckas-Claude wants to merge 6 commits into
ChrisRackauckas-Claude wants to merge 6 commits into
Conversation
Sparse broadcast of W = M/dtgamma - J drops exact zeros, so nnz(W) fluctuates with the Jacobian's values and KLU/UMFPACK redo symbolic analysis nearly every step. Give CPU SparseMatrixCSC W a dedicated path in the SparseArrays extension for scalar (UniformScaling, ScalarOperator) and Diagonal mass matrices: the first call widens the pattern once to W ∪ J ∪ nz(M), and each call rewrites nonzeros(W) in place — positionally when W and J already share a pattern, by a merge pass otherwise — so the pattern no longer depends on values. Values are bitwise identical to the copyto!/broadcast paths they replace, including stored -0.0 semantics. dae_jacobian2W! gets the same treatment for W = J_u + cj*J_du, and calc_J_dae! uses a stable in-place J_du - J_u via _sparse_pattern_stable_sub!, which falls back to broadcast for non-CPU-sparse arrays. Design from @hexaeder's comment on SciML#4663; stacked on that branch. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Devin <noreply@cognition.ai> Agent-Harness: devin 3000.11.3 Agent-Model: swe-2-high Agent-Session: local Devin session (log /home/crackauc/sandbox/goals/performance/jobs/pr-pattern-stable-W/log.txt)
ChrisRackauckas-Claude
force-pushed
the
pattern-stable-sparse-W
branch
from
September 28, 2026 16:11
4c38b1c to
8bac579
Compare
Note in the pattern-stable jacobian2W! header that an over-approximated jac_prototype under a Diagonal mass matrix keeps always-zero entries stored, which raises LU fill (~+11% fill, +12-23% per refactorization for KLU on an n=1002 benchmark; UMFPACK unaffected) — remedied by a tighter prototype. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Devin <noreply@cognition.ai> Agent-Harness: devin 3000.11.3 Agent-Model: swe-2-high Agent-Session: local Devin session (log /home/crackauc/sandbox/goals/performance/jobs/pr-pattern-stable-W/log.txt)
Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Devin <noreply@cognition.ai> Agent-Harness: Devin CLI 3000.11.3 (conflict resolution), Claude Code 2.1.285 (orchestration) Agent-Model: fusion-claude-opus-5-5-high-sidekick-swe-2-medium Agent-Session: local Claude session 3c311569-dda6-4687-bc9f-65febb212c33 (fleet master); Devin log /Users/chrisrackauckas/sandbox/master/fusion-fixes/SciML_OrdinaryDiffEq.jl-4683/log.txt
Member
Merged the default branch into this PR (clean merge, no conflicts; head 255e61f) so CI runs on current master. Its earlier failures in SciMLSensitivity Core1 and the downgrade jobs were fixed on master after this PR's last CI run. 🤖 Posted by an AI agent — harness: Devin CLI 3000.11.3 (merge), Claude Code 2.1.285 (posting) · model: fusion-claude-opus-5-5-high-sidekick-swe-2-medium |
Route aliased sparse W assembly through pattern widening before applying mass-matrix shifts. Test missing diagonal entries and require successful DAE solves that agree with their analytic endpoint. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Codex <noreply@openai.com> Agent-Harness: Codex CLI 0.164.0 Agent-Model: gpt-6.1-sol Agent-Session: local fixer job SciML__OrdinaryDiffEq.jl__4683 (no session URL)
Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Muse <noreply@meta.com> Agent-Harness: Muse CLI Code Agent-Model: muse-wonder-full-1.0 Agent-Session: local fixer job SciML__OrdinaryDiffEq.jl__4683 (no session URL)
This branch has not been deployed
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.
Summary
Built on #4663 (now merged via merge commit f61e499; this branch is based on its head
669ce01and adds one commit on top).Design credited to @hexaeder's comment on #4663: for a CPU
SparseMatrixCSCWwith a non-scalar mass matrix,Wis assembled via@.. W = muladd(-mass_matrix, invdtgamma, J), and sparse broadcast drops exact zeros. Whenever a Jacobian entry becomes0.0,nnz(W)changes and KLU/UMFPACK re-run symbolic analysis. On the reported power-grid DAE (n=192, Rodas5P, PureKLU) the pattern changed on 102/128 steps and symbolic analysis cost ~9% of the solve.This PR replaces
_update_sparse_diagonal!with dedicated sparse methods in theOrdinaryDiffEqDifferentiationSparseArrays extension:jacobian2W!(W::SparseMatrixCSC, M, dtgamma, J::SparseMatrixCSC)for scalarM(UniformScaling,ScalarOperator) andDiagonalM. Every other mass-matrix type keeps the existing broadcast path.W's pattern is widened once toW ∪ J ∪ nz(M); afterwards it is fixed.nonzeros(W)is rewritten over the sorted column indices — positionally whenWandJshare a pattern, by a merge pass whenWis wider — slotsJdoesn't store get0.0, the diagonal gets the mass contribution. Stored zeros stay stored, so the pattern never depends on values.dae_jacobian2W!(W, J_u, J_du, cj)gets the same treatment forW = J_u + cj·J_du, and theJ_du - J_ubroadcast incalc_J_dae!is handled by_sparse_pattern_stable_sub!(widensJ_duonce toJ_du ∪ J_u, then subtracts in place).nzrange,rowvals,nonzeros, the documentedSparseMatrixCSCconstructor,copyto!); no.colptrfield access.Tests
Fails on base (
669ce01b7), passes on this branch.Base:
Branch:
The solve-level test uses a 3×3 mass-matrix DAE (
Diagonal([1,1,0])) whose(2,3)Jacobian entry is exactly0.0fort < 0.5, run under Rodas5P and FBDF (NLNewton(always_new = true)so FBDF rebuildsWevery solve). On base,nnz(W)flips when the entry crosses zero; on this branch it is constant.Unit coverage also includes: bitwise equality vs. the previous paths (including a stored
-0.0), widening toW ∪ J ∪ nz(M), partial-diagonal insertion,Diagonalnz(M)semantics, non-scalar/non-diagonal mass matrices still taking the broadcast path, and theJ_du - J_ustable subtraction.Solution equivalence vs base
sol.u[end]bitwise identical on both test problems.dt(same step sequence):max|diff| = 1.5e-15— the kept stored zeros change KLU's symbolic elimination order, so results differ only by LU-ordering roundoff.Performance
Mass-matrix DAE benchmark (1D diffusion + algebraic rows, sparse
jac_prototypewith gated near-band coupling entries that toggle between0.0and nonzero ~15× per solve;linsolve = KLUFactorization()(PureKLU);taskset -c 5,JULIA_NUM_THREADS=1, best of 3):* FBDF converged with a stale W and rarely rebuilt it, so the oscillation was not exercised; with
always_newit fails the same way at unit level.jacobian2W!itself (n=1000, nnz=5991, steady state,JULIA_NUM_THREADS=1):I)copyto!+ diagonal updateDiagonal@.. muladdbroadcastWhen
WandJshare a pattern (the common steady state) the branch does a positional rewrite — cheaper than broadcast. WhenWis wider thanJ(after widening), a two-pointer merge pass runs (~68–90µs at this size, still 0 allocations). The scalar-M case was already pattern-stable on base viacopyto!; it pays a small_same_patterncheck overhead for uniformity.Solve times on this loaded box are noisy; the branch does strictly less work per step but can pay extra LU fill when
jac_prototypestores entries whose rows/columns are structurally absent for long stretches (see limitations).Interleaved re-measurement (REPORT2, 2026-09-30)
Second measurement round, pinned and interleaved (
taskset,JULIA_NUM_THREADS=1):Rodas5P()default solver: full tspan (0, 15) —nnz(W)changed on 106/143 steps on master vs 0/143 on this branch; clean-rep medians 0.271 s → 0.107 s (min 0.119 → 0.088 s). On (0, 1): 72/91 → 0/91 pattern changes, times equal within noise.KLUFactorization,PureKLUFactorization,UMFPACKFactorization; Rodas5P and FBDF): branch equal or faster in 6/6 combos (e.g. Rodas5P+PureKLU 0.305 → 0.297 s; Rodas5P+UMFPACK 0.828 → 0.771 s; FBDF+SuiteKLU 0.226 → 0.153 s).Not verified / limitations
JULIA_NUM_THREADS=1, taskset-pinned): DifferentiationGROUP=Core,Sparse,QApass;GROUP=BDF(Core) passes;GROUP=Rosenbrock(Core) still in progress at push time on this heavily loaded machine.W(CUDA CSR/CSC) unchanged — still takes the allocating path.W ∪ J ∪ nz(M): ifjac_prototypedeclares many entries that are structurally disconnected from the matrix's natural connectivity, LU fill-in can grow vs. a minimal pattern. In the reported power-grid case the fluctuating entries live inside the natural stencil, so fill is unaffected.GROUP=Core(also on base/master, unrelated to this diff):scalar_operator_massmatrix_tests.jlerrors withMethodError: no method matching diag(::SciMLOperators.ScalarOperator)insideOrdinaryDiffEqSDIRK._mmdiag(generic_imex_perform_step.jl), introduced by only allow diagonal M for ESDIRK #4560. Reproduced identically on the base worktree. Left for a separate fix.Please ignore until reviewed by @ChrisRackauckas.
Risk assessment
Independent review: Claude Code (Opus 5.5): MERGE, low-medium risk, confidence 80; nnz test discriminates, no regression reproduced (16-rep pinned), bitwise values; needs human review (wide blast radius)
Merge: needs human review
🤖 Generated with Devin (model: swe-2-high), orchestrated by Claude Code (claude-opus-5-5[1m]) session https://claude.ai/code/session_01LPHREnnonfLg1VcE1EJovv
Risk assessment
SparseMatrixCSCW assembly in OrdinaryDiffEq. That covers every stiff solver (Rosenbrock, BDF/FBDF/QNDF, SDIRK, DImplicit/DFBDF) given a sparsejac_prototypeand aUniformScaling,ScalarOperatororDiagonalmass matrix. TheJ_du - J_ustep incalc_J_dae!changes too. ForDiagonalmass-matrix DAEs, W now keeps stored zeros instead of dropping them, which changes the LU ordering. The PR measures the effect as roughly 1e-15 differences at fixeddt, adaptive endpoints about 2–5e-7 apart, and +11% LU fill / +12–23% refactorization time on KLU-class solvers whenjac_prototypestores many entries that are always zero. GPU sparse W, dense W and other mass-matrix types are untouched. Only package-internal names are affected (_update_sparse_diagonal!is removed; a code search finds no users outside this sublibrary), so there is no SemVer impact.OrdinaryDiffEqDifferentiationCore on Julia 1 and lts, plusdowngrade-sublibraries (lib/OrdinaryDiffEqDifferentiation): the sameMethodError: no method matching diag(::ScalarOperator)inscalar_operator_massmatrix_tests.jlalso fails on master (a329b3b, 14f664a, 7393799). The PR description discloses it. Because it aborts the run at the 4th of 17 testsets, those versions never ran the other 13 testsets. The same group passes in full on Juliapre, and the PR's newjacobian2W sparse(23/23) andDAE jacobian2W sparse(14/14) tests pass on Julia 1.OrdinaryDiffEqNonlinearSolveCore (Julia 1):LineSearchExceptionin Newton Tests. On master the same job also fails, though later, in "Mass Matrix Accuracy Tests". The identical Newton error shows up on unrelated PR branches (fix-isoutofdomain-multistep-history,agent/reactant-jit-solve) after the 2026-09-29 registry bumps. This job also installs the registeredOrdinaryDiffEqDifferentiation v3.12.4rather than this branch, so the PR's code never runs there. Pre-existing/environmental, and not disclosed in the PR.OrdinaryDiffEqRosenbrock [QA](Rosenbrock32 DAE inference, 39/40),downgrade (lib/DiffEqBase)(high_level_solve.jl:94/98/100), GPU (the same 3 QNDFmass=diag_cufailures, 170/3/12) and SciMLSensitivity Core1 (Mooncake with MooncakeAdjoint) all fail the same way on master 7393799 / 14f664a.jacobian2W!,dae_jacobian2W!,_throwWJerror, …). These are the package's own names used from its extension, not internals of another dependency._widen_pattern!changes the structure ofW, and_sparse_pattern_stable_sub!changes the structure ofJ_du, in place viacopyto!.J_duis the buffer the user'sf.jacwrites into on the next step. It is only widened whenJ_uandJ_dupatterns differ, which needs a user jac that itself changes the structure. In that case a jac writingnzvalby position would write to the wrong slots. Worth a reviewer's look._update_sparse_diagonal!unit test is replaced by bitwise-equality tests.🤖 Risk assessment posted by an AI agent (fleet master) — harness: Devin CLI / fusion-claude-opus-5-5-high-sidekick-swe-2-medium; dispatched by Claude Code 2.1.285 fleet-master head, model claude-opus-5-5[1m]
Conversation: local session 3c311569-dda6-4687-bc9f-65febb212c33 (no session URL)
Risk assessment (independent review, Codex CLI 0.164.0-alpha.11.1 gpt-6-astra, slot 1, head 8cf5091)
Review round 1, written by the reviewer named above (Codex CLI 0.164.0-alpha.11.1 / gpt-6-astra) in a session other than the PR author's, and copied here by the posting agent without change to its findings. The posting agent did not re-run the reviewer's commands.
Summary: Preserves CPU CSC W patterns across changing Jacobian values and DAE Jacobian subtraction. The new same-pattern fast path applies diagonal shifts twice when W aliases J and a later diagonal slot is missing; that result regression needs correction.
Blast radius: CPU SparseMatrixCSC W assembly for scalar/Diagonal mass matrices, DAE partial-Jacobian reconstruction and sparse in-place subtraction, including Rodas5P and FBDF.
Evidence: 184 checks pass, 2 fail, 1 skips; changed sparse-assembly tests run under the green Differentiation Core check, with both failed signatures matching master. Post-freeze paired Julia execution confirms the aliasing counterexample passes on base and fails on head.
Blocking findings
lib/OrdinaryDiffEqDifferentiation/ext/OrdinaryDiffEqDifferentiationSparseArraysExt.jl:326— confirmed by running: withJ = sparse([1,1,2], [1,2,1], [3.0,1.0,0.5], 2, 2),jacobian2W!(J, I, 0.1, J)returns[-17.0 1.0; 0.5 -10.0]; the expected matrix is[-7.0 1.0; 0.5 -10.0], which the same call produces on the unfixed base._fill_same_pattern!shifts the first diagonal before finding the absent second diagonal; fallback reads the already modified aliased source and shifts it a second time. This is a direct-call regression in a declared-public, documented helper with no non-aliasing prohibition. No ordinary solver caller withW === Jwas found; the finding does not assert normal distinct-buffer solves are wrong. Validate diagonal/pattern coverage before writing, or branch once for aliases before this fast path, and add a partial-diagonal alias regression. The latter remedy costs one identity check on the common path and avoids a general copy.Non-blocking findings
lib/OrdinaryDiffEqDifferentiation/ext/OrdinaryDiffEqDifferentiationSparseArraysExt.jl:24: The extensive performance narrative includes concrete fill/refactorization percentages without a reproducible benchmark in the diff. Keep the measured setup with the review evidence and shorten implementation comments to the pattern contract.lib/OrdinaryDiffEqDifferentiation/test/jacobian2w_sparse_tests.jl:143: The solve-level pattern test should assert successful completion and an independent solution/reference as well as multiple stable nnz samples; an early failed solve can still produce a constant nnz history.What I ran
A complete independent assessment was frozen before reading the PR body, any prior review, other assessment notes, or coordinator-run Julia output. This final assessment preserves that sequence and identifies subsequent evidence below. In each exact detached head,
git rev-parse HEADmatched the Head above (exit 0),git diff 14b964b315e1310b5e3621a1bcfe6b92e9e506aa...HEADexactly matched the supplied complete diff (exit 0), andgit diff --check 14b964b315e1310b5e3621a1bcfe6b92e9e506aa...HEADreturned no output (exit 0). Read all changed lines and targeted surrounding source/tests withrg,sedandcat; no root AGENTS.md or CLAUDE.md existed. Initially extracted Agent-Harness/Agent-Model trailers withgit log -1 --no-merges --format=%B; post-freeze verification corrected this togit log -1 --first-parent --no-merges --format=%Bso imported master commits are excluded. Final author metadata uses the newest PR-line non-merge commit. No Julia process was launched by this assessor, so there is no local Julia version/test exit code to report. The recorded Base is the fetched origin/master used for the three-dot diff; GraphQL's baseRefOid snapshot is 59ba40e.Read all 366 new extension lines, generic/dense/allocating W assembly, scalar-operator tests, DAE Jacobian decomposition, Newton/Rosenbrock callers and test-group wiring. Existing tests use distinct W/J arrays and therefore do not exercise the suspected aliasing failure. Pattern-preservation tests satisfy the cache-state coverage requirement for normal distinct arrays; they do not establish the alias case.
Inspected CI check/log URLs:
The SciMLSensitivity Core4 failure is
AssertionError: mi2 !== nothingattest/Core4/ensembles.jl:19, inside Enzymeparallelrules.jl:233; the exact signature also occurs on master run https://github.com/SciML/OrdinaryDiffEq.jl/actions/runs/41050161729. The OrdinaryDiffEqNonlinearSolve Core failure, where its log is available, isLineSearchException: Search direction is not a direction of descent. Step length: 0.0in Newton Tests; the exact signature also occurs on master run https://github.com/SciML/OrdinaryDiffEq.jl/actions/runs/41058796614. These baseline matches do not make the failed jobs green.After the complete independent review was frozen, inspected the coordinator's raw serial Julia 1.13.3 probe output on exact head and fetched master, using four Julia threads, one BLAS thread, isolated temporary/depot directories, and the same external dependency Manifest. This assessor launched no Julia process. The exact probe was:
Head raises
Test Failed:[-17.0 1.0; 0.5 -10.0] == [-7.0 1.0; 0.5 -10.0]is false. Base prints[-7.0 1.0; 0.5 -10.0]and the assertion passes. These were persistent Julia-tool evaluations, so no OS process exit code is invented. This confirms the independently frozen suspected finding. Public declaration is inlib/OrdinaryDiffEqDifferentiation/src/OrdinaryDiffEqDifferentiation.jl:107and the docs list isdocs/src/devtools/internals/public_api.md:300; no alias prohibition was found.Read the author's pattern/fill/benchmark claims and earlier body assessments only after freeze. No earlier assessment pins the current
8cf509191cb61b6ad165a63255d1120f9df33d93head; the current head is an October 16 master merge above an October 13 merge and a September 30 authored commit. Same-head status is not established, so no REVIEWER_GRADE is emitted. Author performance tables are attributed reports, not measurements rerun here; no net speedup is claimed.What I did not verify
The coordinator's narrow base/head aliasing repro was inspected post-freeze; no full solve suite or exhaustive alias combinations were run by this assessor. No independently reviewed performance benchmark, KLU/UMFPACK symbolic-reuse trace, full DAE convergence suite or broad downstream rerun. GPU concrete types keep their generic allocating path; passing GPU check records were seen but raw GPU output was not inspected.
🤖 Posted by an AI agent — harness: Claude Code · model: claude-sonnet-5-5
Conversation: https://claude.ai/code/session_01379heiiB35TtywhR7uSU74
Fix by Codex CLI 0.164.0 gpt-6.1-sol (head 60493f5)
The sparse same-pattern fast path now requires distinct W and J buffers. When they alias, pattern widening completes before any mass-matrix shift, preventing a stored diagonal from being shifted twice when a later diagonal is absent.
Added nine alias cases across scalar and diagonal mass matrices and three missing-diagonal patterns. The DAE pattern test now requires successful completion, the final time, and agreement with an analytic solution. Shortened the implementation comment to the pattern contract.
Validation
Julia 1.12.4, four Julia threads, one BLAS thread; one-hour test timeouts.
Failing before the fix and passing after, using the same command from the repository root:
GROUP=Core timeout 3600 julia --project=lib/OrdinaryDiffEqDifferentiation -e 'using Pkg; Pkg.test()'Before (exit 1):
After (exit 0): all 17 Core testsets pass, 259 assertions total; sparse Jacobian tests pass 38/38. Actual output tail:
QA command (exit 0):
GROUP=QA timeout 3600 julia --project=lib/OrdinaryDiffEqDifferentiation -e 'using Pkg; Pkg.test()'Actual output tail (the two broken allocation checks are existing checks; this fix adds none):
Formatting, spelling over the committed diff, and whitespace checks all exit 0 with no output:
julia --project=@runic -m Runic --inplace lib/OrdinaryDiffEqDifferentiation/ext/OrdinaryDiffEqDifferentiationSparseArraysExt.jl lib/OrdinaryDiffEqDifferentiation/test/jacobian2w_sparse_tests.jl git diff --unified=0 HEAD^ HEAD | typos - git diff --check HEAD^ HEADExisting CI failures
Core4's Enzyme
AssertionError: mi2 !== nothingalso occurs on an earlier master push. Latest master Core4 passes with Enzyme 0.13.217 / EnzymeCore 0.8.27 / Enzyme_jll 0.0.304+0, whereas both failing runs use Enzyme 0.13.216. The two master runs use the same SciMLSensitivity 7.119.14. This is consistent with an external dependency resolution; no relevant OrdinaryDiffEq fix was identified to merge.NonlinearSolve Core's
LineSearchException: Search direction is not a direction of descent. Step length: 0.0also fails on the latest master push that actually includes that job. The newest overall sublibrary run omits NonlinearSolve through changed-project filtering. Neither pre-existing failure was patched here.Not verified locally: downstream Core4 or NonlinearSolve Core, Julia 1.13, GPU paths, or benchmarks. No new independent review was performed. A redundant diagnostic Core run with debug information disabled was stopped after the standard full Core run passed.
Next counted review must come from a smart model in a fresh session, not this fix session (risk.md § Independent reviews).
Links
🤖 Posted by an AI agent — harness: Codex CLI 0.164.0 · model: gpt-6.1-sol
Conversation: local fixer job SciML__OrdinaryDiffEq.jl__4683 (no session URL)
Fix by Muse CLI Code muse-wonder-full-1.0 (head 6391a7c)
Merged the current default branch (
masterat 6343f5a, 67 commits) into this branch; the merge was clean with no conflicts and no other code change was needed. The PR diff against the new base is unchanged (the same 5 files inOrdinaryDiffEqDifferentiation).What the merge fixes: the Documentation,
OrdinaryDiffEqTaylorSeriesImplicitCore/QA, downgradeOrdinaryDiffEqTaylorSeries/OrdinaryDiffEqTaylorSeriesImplicit, and ProbNumDiffEq downstream failures on the previous head all carried the same signature, TaylorDiff failing to precompile withTypeError: non-boolean (Symbolics.Num) used in boolean contextinside ChainRulesfastmath_able.jl. The merged default branch raises the TaylorDiff compat floor to 0.3.6 (the release that loads with current ChainRules) in both Taylor sublibraries, and the local test resolution now selects TaylorDiff v0.3.6.Still failing, pre-existing on the default branch (same signatures there per
rack ci compare, not patched here): GPU CI andOrdinaryDiffEqDefault [GPU], AD (Julia lts) ReverseDiff tape error, SciMLSensitivity Core2, andOrdinaryDiffEqNonlinearSolveCore. I reran NonlinearSolve Core locally on this merged head: it exits 1 with the identicalLineSearchException: Search direction is not a direction of descent. Step length: 0.0in Newton Tests, on a denseMatrix{Float64}W path this PR does not touch.Validation
Julia 1.12.4,
JULIA_NUM_THREADS=4, one BLAS thread.Relevant group, in full (exit 0; a first attempt with a 3600 s timeout was cut off by the timeout under heavy machine load after 11 passing testsets and no failures, the rerun below completed):
GROUP=Core timeout 7200 julia --project=lib/OrdinaryDiffEqDifferentiation -e 'using Pkg; Pkg.test()'QA (exit 0):
GROUP=QA timeout 7200 julia --project=lib/OrdinaryDiffEqDifferentiation -e 'using Pkg; Pkg.test()'Previously failing Taylor groups (both exit 0; this sublibrary's
runtests.jldoes not branch onGROUP, so Core and QA run the same testset, as in CI — the point is TaylorDiff now precompiles and loads):Formatting and spelling (both exit 0, no changes, no output):
julia --project=@runic -m Runic --inplace lib/OrdinaryDiffEqDifferentiation/ext/OrdinaryDiffEqDifferentiationSparseArraysExt.jl lib/OrdinaryDiffEqDifferentiation/src/derivative_utils.jl lib/OrdinaryDiffEqDifferentiation/test/jacobian2w_sparse_tests.jl lib/OrdinaryDiffEqDifferentiation/test/dae_jacobian2w_sparse_tests.jl lib/OrdinaryDiffEqDifferentiation/test/qa/qa.jl git diff upstream/master...HEAD | typos - git diff --check upstream/master...HEADNot verified locally: Documentation build, the downgrade-sublibraries jobs, ProbNumDiffEq and SciMLSensitivity downstream, AD (lts), and GPU groups. The first three share the TaylorDiff precompile signature that the merged compat floor addresses and that now loads locally; the rest are pre-existing on the default branch as noted above. CI on this head is the check for all of them.
Next counted review must come from a smart model in a fresh session, not this fix session (risk.md § Independent reviews).
🤖 Posted by an AI agent — harness: Muse CLI Code · model: muse-wonder-full-1.0
Conversation: local fixer job SciML__OrdinaryDiffEq.jl__4683 (no session URL)