From dc94fc60f7c82c937924c517322943d2a8faf0de Mon Sep 17 00:00:00 2001 From: Chris Rackauckas Date: Sat, 6 Jun 2026 04:45:27 -0400 Subject: [PATCH 1/3] fix: restore Julia 1.10 support for Double64 intlog2 path + re-enable downgrade CI The Issue-206 test "Double64 with pade order 13" errored on Julia 1.10 because intlog2(::Double64) routed through ceil(UInt64, ::Double64), which requires trunc(::Type{UInt64}, ::Double64). Julia 1.11's Base added a generic trunc(::Type{<:Integer}, ::AbstractFloat) fallback, but 1.10 lacks it and DoubleFloats never defines trunc for Unsigned. Routing intlog2 through a signed Int (ceil(Int, ...)), which DoubleFloats does define, restores 1.10 support with identical behavior (the argument is a positive, bounded operator norm; verified byte-for-byte equal to the old result across the full input range). Re-enable the downgrade workflow (remove `if: false`) and raise the lowest [compat] floors that resolve and pass the Core suite on Julia 1.10: - DoubleFloats: 1 -> 1.1.14 (1.0.x pins GenericSchur to <=0.4, conflicting with GenericSchur 0.5.3; 1.1.14 is the first DoubleFloats allowing GenericSchur 0.5) - StaticArrays: 1.2 -> 1.9.8 (versions < 1.9.8 either fail to precompile on Julia 1.10 with `require_one_based_indexing not defined`, or hit an ambiguous lu(::StaticMatrix, ::Val{true}) with LinearAlgebra's deprecated method) Both suites run locally on Julia 1.10: - latest compat: Quality Assurance 10/10, Basic Tests 329 pass / 1 broken - downgrade floors: Quality Assurance 10/10, Basic Tests 329 pass / 1 broken (the 1 broken is a pre-existing @test_broken; the Issue-206 Double64 test passes) Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/Downgrade.yml | 1 - Project.toml | 4 ++-- src/exp_generic.jl | 6 +++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/Downgrade.yml b/.github/workflows/Downgrade.yml index 8a745742..034d25b1 100644 --- a/.github/workflows/Downgrade.yml +++ b/.github/workflows/Downgrade.yml @@ -12,7 +12,6 @@ on: - 'docs/**' jobs: downgrade: - if: false # Disabled pending fix - see #208 for tracking re-enablement name: "Downgrade" strategy: matrix: diff --git a/Project.toml b/Project.toml index d1f21493..6016219a 100644 --- a/Project.toml +++ b/Project.toml @@ -24,7 +24,7 @@ ExponentialUtilitiesStaticArraysExt = "StaticArrays" Adapt = "3.4.0, 4" Aqua = "0.8" ArrayInterface = "7.1" -DoubleFloats = "1" +DoubleFloats = "1.1.14" ForwardDiff = "0.10.13" GPUArraysCore = "0.1, 0.2" GenericSchur = "0.5.3" @@ -35,7 +35,7 @@ Printf = "1.10" Random = "1" SafeTestsets = "0.1" SparseArrays = "1.10" -StaticArrays = "1.2" +StaticArrays = "1.9.8" Test = "1" julia = "1.10" diff --git a/src/exp_generic.jl b/src/exp_generic.jl index 78a868d5..71f503c8 100644 --- a/src/exp_generic.jl +++ b/src/exp_generic.jl @@ -1,5 +1,9 @@ intlog2(x::T) where {T <: Integer} = T(8 * sizeof(T) - leading_zeros(x - one(T))) -intlog2(x) = x > typemax(UInt) ? ceil(Int, log2(x)) : intlog2(ceil(UInt, x)) % Int +# `ceil(Int, x)` rather than `ceil(UInt, x)` so the integer-conversion path only needs +# `trunc(::Type{Int}, ::AbstractFloat)`, which extended-precision types such as +# DoubleFloats.Double64 define, whereas `trunc(::Type{<:Unsigned}, ::AbstractFloat)` is +# unavailable on Julia 1.10. `x` here is a positive norm, so the signed conversion matches. +intlog2(x) = x > typemax(Int) ? ceil(Int, log2(x)) : intlog2(ceil(Int, x)) function naivemul!( C::StridedMatrix{T}, A::StridedMatrix{T}, From a828025d71a5e4f8c51daa0ddddb26d8fb79ea9d Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sat, 6 Jun 2026 14:28:32 -0400 Subject: [PATCH 2/3] ci(downgrade): allow-reresolve true (was false) Strict no-reresolve can't reconcile floored core deps against the latest-floating transitive SciML stack; reresolve still enforces the floor [compat] pins but resolves a consistent set. Verified locally. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/Downgrade.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Downgrade.yml b/.github/workflows/Downgrade.yml index 034d25b1..cb86bb34 100644 --- a/.github/workflows/Downgrade.yml +++ b/.github/workflows/Downgrade.yml @@ -22,5 +22,5 @@ jobs: julia-version: "1.10" group: "${{ matrix.group }}" skip: "Pkg,TOML" - allow-reresolve: false + allow-reresolve: true secrets: "inherit" From 83edb51c00fb4705f759a3c19e6f092bcb49dd82 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sat, 6 Jun 2026 18:03:33 -0400 Subject: [PATCH 3/3] ci(downgrade): allow-reresolve false (strict SciML default) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the strict SciML default `allow-reresolve: false` so Pkg.test must instantiate the exact deps-floor + latest-transitive set with no reconciliation. Verified locally on Julia 1.10 (deps-mode: only [deps] [compat] pinned to floors, allow_reresolve=false): Quality Assurance: 10/10 Basic Tests: 329 pass, 1 broken (pre-existing @test_broken), 330 total "Testing ExponentialUtilities tests passed" (exit 0) No floor raises needed — current [deps] floors are strict-consistent with the latest transitive ecosystem. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/Downgrade.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Downgrade.yml b/.github/workflows/Downgrade.yml index cb86bb34..034d25b1 100644 --- a/.github/workflows/Downgrade.yml +++ b/.github/workflows/Downgrade.yml @@ -22,5 +22,5 @@ jobs: julia-version: "1.10" group: "${{ matrix.group }}" skip: "Pkg,TOML" - allow-reresolve: true + allow-reresolve: false secrets: "inherit"