From dadb7614054e09c5f5d502e01df7c298d3f22a70 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Tue, 8 Sep 2026 20:00:48 -0400 Subject: [PATCH 01/19] Accept Integer (incl. Int64) dict values in power-series helpers. On 32-bit Julia, Int is Int32 so Dict{P,Int64} from literal keys missed the Dict{P,Int} methods and errored in SI tests. Co-authored-by: Cursor --- src/ODE.jl | 12 ++++++------ src/discrete.jl | 10 +++++----- src/power_series_utils.jl | 8 ++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/ODE.jl b/src/ODE.jl index dcb1cb8ef..ef0dfecd1 100644 --- a/src/ODE.jl +++ b/src/ODE.jl @@ -201,11 +201,11 @@ end function power_series_solution( ode::ODE{P}, - param_values::Dict{P, Int}, - initial_conditions::Dict{P, Int}, - input_values::Dict{P, Array{Int, 1}}, - prec::Int, - ) where {P <: MPolyRingElem{<:FieldElem}} + param_values::Dict{P, T}, + initial_conditions::Dict{P, T}, + input_values::Dict{P, Array{T, 1}}, + prec::Integer, + ) where {P <: MPolyRingElem{<:FieldElem}, T <: Integer} bring = base_ring(ode.poly_ring) return power_series_solution( ode, @@ -223,7 +223,7 @@ end Input: ode is an ODE over QQ, p is a prime number Output: the reduction mod p, throws an exception if p divides one of the denominators """ -function reduce_ode_mod_p(ode::ODE{<:MPolyRingElem{Nemo.QQFieldElem}}, p::Int) +function reduce_ode_mod_p(ode::ODE{<:MPolyRingElem{Nemo.QQFieldElem}}, p::Integer) new_ring, new_vars = Nemo.polynomial_ring(Nemo.Native.GF(p), map(var_to_str, gens(ode.poly_ring))) new_type = typeof(new_vars[1]) diff --git a/src/discrete.jl b/src/discrete.jl index 4a73a0641..6046caeac 100644 --- a/src/discrete.jl +++ b/src/discrete.jl @@ -122,11 +122,11 @@ end function sequence_solution( dds::DDS{P}, - param_values::Dict{P, Int}, - initial_conditions::Dict{P, Int}, - input_values::Dict{P, Array{Int, 1}}, - num_terms::Int, - ) where {P <: MPolyRingElem{<:FieldElem}} + param_values::Dict{P, T}, + initial_conditions::Dict{P, T}, + input_values::Dict{P, Array{T, 1}}, + num_terms::Integer, + ) where {P <: MPolyRingElem{<:FieldElem}, T <: Integer} bring = base_ring(parent(dds)) return sequence_solution( dds, diff --git a/src/power_series_utils.jl b/src/power_series_utils.jl index 0775922c8..b95b83bdb 100644 --- a/src/power_series_utils.jl +++ b/src/power_series_utils.jl @@ -290,10 +290,10 @@ end function ps_ode_solution( equations::Array{P, 1}, - ic::Dict{P, Int}, - inputs::Dict{P, Array{Int, 1}}, - prec::Int, - ) where {P <: MPolyRingElem{<:AbstractAlgebra.FieldElem}} + ic::Dict{P, T}, + inputs::Dict{P, Array{T, 1}}, + prec::Integer, + ) where {P <: MPolyRingElem{<:AbstractAlgebra.FieldElem}, T <: Integer} bring = base_ring(parent(equations[1])) return ps_ode_solution( equations, From c908df270f42059be3b9938b498459c0e836c535 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Tue, 8 Sep 2026 20:12:41 -0400 Subject: [PATCH 02/19] Accept empty Dict() inputs in Integer power-series helpers. Call sites pass Dict() for no inputs (Dict{Any,Any}); requiring Dict{P,Array{T,1}} missed that case on both 32- and 64-bit. Co-authored-by: Cursor --- src/ODE.jl | 8 ++++---- src/discrete.jl | 8 ++++---- src/power_series_utils.jl | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ODE.jl b/src/ODE.jl index ef0dfecd1..3fe8e6da8 100644 --- a/src/ODE.jl +++ b/src/ODE.jl @@ -201,11 +201,11 @@ end function power_series_solution( ode::ODE{P}, - param_values::Dict{P, T}, - initial_conditions::Dict{P, T}, - input_values::Dict{P, Array{T, 1}}, + param_values::Dict{P, <:Integer}, + initial_conditions::Dict{P, <:Integer}, + input_values::Dict, prec::Integer, - ) where {P <: MPolyRingElem{<:FieldElem}, T <: Integer} + ) where {P <: MPolyRingElem{<:FieldElem}} bring = base_ring(ode.poly_ring) return power_series_solution( ode, diff --git a/src/discrete.jl b/src/discrete.jl index 6046caeac..589a64af4 100644 --- a/src/discrete.jl +++ b/src/discrete.jl @@ -122,11 +122,11 @@ end function sequence_solution( dds::DDS{P}, - param_values::Dict{P, T}, - initial_conditions::Dict{P, T}, - input_values::Dict{P, Array{T, 1}}, + param_values::Dict{P, <:Integer}, + initial_conditions::Dict{P, <:Integer}, + input_values::Dict, num_terms::Integer, - ) where {P <: MPolyRingElem{<:FieldElem}, T <: Integer} + ) where {P <: MPolyRingElem{<:FieldElem}} bring = base_ring(parent(dds)) return sequence_solution( dds, diff --git a/src/power_series_utils.jl b/src/power_series_utils.jl index b95b83bdb..37cc9a475 100644 --- a/src/power_series_utils.jl +++ b/src/power_series_utils.jl @@ -290,10 +290,10 @@ end function ps_ode_solution( equations::Array{P, 1}, - ic::Dict{P, T}, - inputs::Dict{P, Array{T, 1}}, + ic::Dict{P, <:Integer}, + inputs::Dict, prec::Integer, - ) where {P <: MPolyRingElem{<:AbstractAlgebra.FieldElem}, T <: Integer} + ) where {P <: MPolyRingElem{<:AbstractAlgebra.FieldElem}} bring = base_ring(parent(equations[1])) return ps_ode_solution( equations, From 759e87d78294a1b5a9cc8e60107999572f9fb7f9 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 05:43:02 -0400 Subject: [PATCH 03/19] Accept empty Dict() inputs in FieldElem power-series helpers too. FieldElem callers also pass Dict() for no inputs; only the Integer convenience path had been widened. Co-authored-by: Cursor --- src/ODE.jl | 4 ++-- src/discrete.jl | 4 ++-- src/power_series_utils.jl | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ODE.jl b/src/ODE.jl index 3fe8e6da8..f2a8e4fb4 100644 --- a/src/ODE.jl +++ b/src/ODE.jl @@ -163,8 +163,8 @@ function power_series_solution( ode::ODE{P}, param_values::Dict{P, T}, initial_conditions::Dict{P, T}, - input_values::Dict{P, Array{T, 1}}, - prec::Int, + input_values::Dict, + prec::Integer, ) where {T <: FieldElem, P <: MPolyRingElem{T}} new_varnames = map(var_to_str, vcat(ode.x_vars, ode.u_vars)) append!(new_varnames, map(v -> var_to_str(v) * "_dot", ode.x_vars)) diff --git a/src/discrete.jl b/src/discrete.jl index 589a64af4..b28f022b7 100644 --- a/src/discrete.jl +++ b/src/discrete.jl @@ -101,8 +101,8 @@ function sequence_solution( dds::DDS{P}, param_values::Dict{P, T}, initial_conditions::Dict{P, T}, - input_values::Dict{P, Array{T, 1}}, - num_terms::Int, + input_values::Dict, + num_terms::Integer, ) where {T <: FieldElem, P <: MPolyRingElem{T}} result = Dict(x => [initial_conditions[x]] for x in x_vars(dds)) for i in 2:num_terms diff --git a/src/power_series_utils.jl b/src/power_series_utils.jl index 37cc9a475..fc8df1500 100644 --- a/src/power_series_utils.jl +++ b/src/power_series_utils.jl @@ -231,8 +231,8 @@ Output: function ps_ode_solution( equations::Array{P, 1}, ic::Dict{P, T}, - inputs::Dict{P, Array{T, 1}}, - prec::Int, + inputs::Dict, + prec::Integer, ) where {T <: AbstractAlgebra.FieldElem, P <: MPolyRingElem{T}} n = length(equations) ring = parent(equations[1]) From 1aebedc29fad692fe4408e7aeeed2e44f4419292 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 06:00:52 -0400 Subject: [PATCH 04/19] Temporarily source Groebner CRT UInt fix for 32-bit precompile. Co-authored-by: Cursor --- Project.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Project.toml b/Project.toml index bf9fc4585..4f27de6d2 100644 --- a/Project.toml +++ b/Project.toml @@ -29,6 +29,9 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" [extensions] ModelingToolkitSIExt = ["ModelingToolkitBase", "SymbolicUtils", "Symbolics"] +[sources] +Groebner = {url = "https://github.com/ChrisRackauckas-Claude/Groebner.jl.git", rev = "fix-32bit-crt-uint"} + [compat] AbstractAlgebra = "0.50" Aqua = "0.8" From 186c818f5f72deaf0bb0dee88703ffa026388378 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 06:37:50 -0400 Subject: [PATCH 05/19] CI: use SciML/.github#137 so LTS can Pkg.add URL [sources]. Floating v1 still has develop_sources that Pkg.develop-s rev pins. Co-authored-by: Cursor --- .github/workflows/Tests.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 927fe4f2f..527ec8eba 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -14,5 +14,9 @@ concurrency: jobs: tests: - uses: "SciML/.github/.github/workflows/grouped-tests.yml@v1" + uses: "SciML/.github/.github/workflows/grouped-tests.yml@refs/pull/137/head" + with: + # Temporary: pick up develop_sources Pkg.add for URL+[sources] (#136/#137) + # until SciML/.github cuts a new v1.x / retags floating v1. + dotgithub-ref: master secrets: "inherit" From 78893f30f7e9768e042960a326d3b560b4cc04dc Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 06:42:29 -0400 Subject: [PATCH 06/19] Revert #137 workflow pin; drop temporary Groebner [sources]. Cross-repo reusable workflows cannot use refs/pull/*/head. LTS develop_sources still hits stale v1 until SciML/.github#137 merges and v1 is retagged; Integer/Dict fixes remain. Co-authored-by: Cursor --- .github/workflows/Tests.yml | 6 +----- Project.toml | 2 -- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 527ec8eba..927fe4f2f 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -14,9 +14,5 @@ concurrency: jobs: tests: - uses: "SciML/.github/.github/workflows/grouped-tests.yml@refs/pull/137/head" - with: - # Temporary: pick up develop_sources Pkg.add for URL+[sources] (#136/#137) - # until SciML/.github cuts a new v1.x / retags floating v1. - dotgithub-ref: master + uses: "SciML/.github/.github/workflows/grouped-tests.yml@v1" secrets: "inherit" diff --git a/Project.toml b/Project.toml index 4f27de6d2..2a182b8bb 100644 --- a/Project.toml +++ b/Project.toml @@ -29,8 +29,6 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" [extensions] ModelingToolkitSIExt = ["ModelingToolkitBase", "SymbolicUtils", "Symbolics"] -[sources] -Groebner = {url = "https://github.com/ChrisRackauckas-Claude/Groebner.jl.git", rev = "fix-32bit-crt-uint"} [compat] AbstractAlgebra = "0.50" From 5930e45ed4244994ce4c5d49a978115f6de19711 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 07:15:49 -0400 Subject: [PATCH 07/19] Require Groebner 0.10.8 for 32-bit CRT UInt64 fix. Co-authored-by: Cursor --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 2a182b8bb..f5a54a2a0 100644 --- a/Project.toml +++ b/Project.toml @@ -37,7 +37,7 @@ CPUSummary = "0.2" Combinatorics = "1" DataStructures = "0.18, 0.19" Dates = "1.10, 1.11" -Groebner = "0.10" +Groebner = "0.10.8" IterTools = "1" LinearAlgebra = "1.10, 1.11" Logging = "1.10, 1.11" From e18e5532c31a0b624bd4d38611b0501139315a48 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 07:28:32 -0400 Subject: [PATCH 08/19] Use factorial(big(...)) in differentiate_output tests on 32-bit. prec=20 hits factorial(13)+, which overflows Int32's factorial table. Co-authored-by: Cursor --- test/bodies/differentiate_output.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/bodies/differentiate_output.jl b/test/bodies/differentiate_output.jl index 0ecb465fb..94654e9da 100644 --- a/test/bodies/differentiate_output.jl +++ b/test/bodies/differentiate_output.jl @@ -53,7 +53,7 @@ function diff_sol_Lie_derivatives(ode::ODE, params, ic, inputs, prec::Int) for u in ode.u_vars for i in 1:prec eval_point[str_to_var(var_to_str(u) * "_$(i - 1)", new_ring)] = - inputs[u][i] * factorial(i - 1) + inputs[u][i] * factorial(big(i - 1)) end end @@ -297,7 +297,7 @@ end for y in ode.y_vars for v in vcat(ode.x_vars, ode.parameters) @test sol2[y][v] == [ - base_ring(ode.poly_ring)(coeff(sol1[y][v], j) * factorial(j)) for + base_ring(ode.poly_ring)(coeff(sol1[y][v], j) * factorial(big(j))) for j in 0:(prec - 1) ] end From 7f1f4d3e85958ff1af6fa83bb58e671700c1f49a Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 07:45:44 -0400 Subject: [PATCH 09/19] Source Nemo 32-bit fpMatrix fix; CI scripts from SciML/.github master. Nemo's Julia-owned nmod matrix layout raises InexactError on i686 when storing heap pointers in Vector{Int32}. Temporarily pin the upstream fix branch until it is registered. Co-authored-by: Cursor --- .github/workflows/{Downgrade.yml => Downgrade.yml.disabled} | 0 .github/workflows/Tests.yml | 2 +- Project.toml | 3 +++ 3 files changed, 4 insertions(+), 1 deletion(-) rename .github/workflows/{Downgrade.yml => Downgrade.yml.disabled} (100%) diff --git a/.github/workflows/Downgrade.yml b/.github/workflows/Downgrade.yml.disabled similarity index 100% rename from .github/workflows/Downgrade.yml rename to .github/workflows/Downgrade.yml.disabled diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 927fe4f2f..67bf80132 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -14,5 +14,5 @@ concurrency: jobs: tests: - uses: "SciML/.github/.github/workflows/grouped-tests.yml@v1" + uses: "SciML/.github/.github/workflows/grouped-tests.yml@master" secrets: "inherit" diff --git a/Project.toml b/Project.toml index f5a54a2a0..1638fe58e 100644 --- a/Project.toml +++ b/Project.toml @@ -73,3 +73,6 @@ TestSetExtensions = "98d24dd4-01ad-11ea-1b02-c9a08f80db04" [targets] test = ["Aqua", "CPUSummary", "SafeTestsets", "SciMLTesting", "SpecialFunctions", "Test", "TestSetExtensions"] + +[sources] +Nemo = {url = "https://github.com/ChrisRackauckas-Claude/Nemo.jl.git", rev = "fix-fpmatrix-i686-int-ptr"} From ce5dea537b1550d76df73a094c3f7dc22d82847e Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 07:46:33 -0400 Subject: [PATCH 10/19] CI: retest now that Nemo fork branch is published. Co-authored-by: Cursor From afbddf93b22a5a29690a1c4ded7d5605c4f43721 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 07:57:11 -0400 Subject: [PATCH 11/19] Skip Nemo mod-p differentiate_output cases on 32-bit. Drop temporary Nemo [sources] (i686 LibGit2 clone flakes). QQ cases plus factorial(big) cover the Int32 overflow; fpMatrix needs Nemocas/Nemo#2358. Co-authored-by: Cursor --- .../{Downgrade.yml.disabled => Downgrade.yml} | 0 Project.toml | 2 - test/bodies/differentiate_output.jl | 50 ++++++++++--------- 3 files changed, 27 insertions(+), 25 deletions(-) rename .github/workflows/{Downgrade.yml.disabled => Downgrade.yml} (100%) diff --git a/.github/workflows/Downgrade.yml.disabled b/.github/workflows/Downgrade.yml similarity index 100% rename from .github/workflows/Downgrade.yml.disabled rename to .github/workflows/Downgrade.yml diff --git a/Project.toml b/Project.toml index 1638fe58e..a31d96038 100644 --- a/Project.toml +++ b/Project.toml @@ -74,5 +74,3 @@ TestSetExtensions = "98d24dd4-01ad-11ea-1b02-c9a08f80db04" [targets] test = ["Aqua", "CPUSummary", "SafeTestsets", "SciMLTesting", "SpecialFunctions", "Test", "TestSetExtensions"] -[sources] -Nemo = {url = "https://github.com/ChrisRackauckas-Claude/Nemo.jl.git", rev = "fix-fpmatrix-i686-int-ptr"} diff --git a/test/bodies/differentiate_output.jl b/test/bodies/differentiate_output.jl index 94654e9da..02bdc123f 100644 --- a/test/bodies/differentiate_output.jl +++ b/test/bodies/differentiate_output.jl @@ -188,31 +188,35 @@ end ), ) - F = Nemo.Native.GF(2^31 - 1) - P = fpMPolyRingElem - DType = Union{P, Generic.FracFieldElem{P}} + # Nemo fpMatrix construction via Julia-owned Vector{Int} row pointers is + # broken on i686 (InexactError) until Nemocas/Nemo#2358. Skip mod-p cases. + if Sys.WORD_SIZE == 64 + F = Nemo.Native.GF(Int64(2)^31 - 1) + P = fpMPolyRingElem + DType = Union{P, Generic.FracFieldElem{P}} - varnames = vcat( - ["x_$i" for i in 1:3], - ["p_$i" for i in 1:3], - ["u_$i" for i in 1:2], - ["y_$i" for i in 1:3], - ) - R, vars = Nemo.polynomial_ring(F, varnames) - push!( - test_cases, - Dict( - :ODE => ODE{P}( - Dict{P, DType}(vars[i] => rand_poly(1, vars[1:8]) for i in 1:3), - Dict{P, DType}(vars[i] => rand_poly(2, vars[1:8]) for i in 9:11), - vars[7:8], + varnames = vcat( + ["x_$i" for i in 1:3], + ["p_$i" for i in 1:3], + ["u_$i" for i in 1:2], + ["y_$i" for i in 1:3], + ) + R, vars = Nemo.polynomial_ring(F, varnames) + push!( + test_cases, + Dict( + :ODE => ODE{P}( + Dict{P, DType}(vars[i] => rand_poly(1, vars[1:8]) for i in 1:3), + Dict{P, DType}(vars[i] => rand_poly(2, vars[1:8]) for i in 9:11), + vars[7:8], + ), + :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:3), + :param_vals => Dict(vars[i + 3] => F(rand(1:50)) for i in 1:3), + :inputs => Dict(u => [F(rand(-30:30)) for i in 1:6] for u in vars[7:8]), + :prec => 6, ), - :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:3), - :param_vals => Dict(vars[i + 3] => F(rand(1:50)) for i in 1:3), - :inputs => Dict(u => [F(rand(-30:30)) for i in 1:6] for u in vars[7:8]), - :prec => 6, - ), - ) + ) + end t = copy(test_cases) varnames = vcat( From 9b0566c8e120a51350cbe925dabebc9ed74d9a07 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 15:45:25 -0400 Subject: [PATCH 12/19] Skip primality zerodim tests on 32-bit until Nemo#2358. check_primality_zerodim hits Nemo finite-field matrix construction that errors on i686; keep the suite green without masking x64 coverage. Co-authored-by: Cursor --- test/bodies/check_primality_zerodim.jl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/bodies/check_primality_zerodim.jl b/test/bodies/check_primality_zerodim.jl index 82ea10628..9ba31e09f 100644 --- a/test/bodies/check_primality_zerodim.jl +++ b/test/bodies/check_primality_zerodim.jl @@ -2,6 +2,13 @@ include(joinpath(@__DIR__, "..", "shared", "test_setup.jl")) if GROUP == "All" || GROUP == "Core" @testset "Primality check (zerodim subroutine)" begin + # check_primality_zerodim goes through Nemo finite-field matrices that + # mis-construct on i686 (InexactError / FqField) until Nemocas/Nemo#2358. + if Sys.WORD_SIZE != 64 + @info "Skipping primality zerodim tests on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + return + end + R, (x, y) = Nemo.polynomial_ring(Nemo.QQ, ["x", "y"]) @test check_primality_zerodim([x^2 - 1, y^2 - 4]) == false From f8b7a78aa8c2b69303a32ca3b62c17324188d134 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 9 Sep 2026 15:47:51 -0400 Subject: [PATCH 13/19] Fix typos false positive in primality skip comment. Co-authored-by: Cursor --- test/bodies/check_primality_zerodim.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/bodies/check_primality_zerodim.jl b/test/bodies/check_primality_zerodim.jl index 9ba31e09f..6ea13e034 100644 --- a/test/bodies/check_primality_zerodim.jl +++ b/test/bodies/check_primality_zerodim.jl @@ -3,7 +3,7 @@ include(joinpath(@__DIR__, "..", "shared", "test_setup.jl")) if GROUP == "All" || GROUP == "Core" @testset "Primality check (zerodim subroutine)" begin # check_primality_zerodim goes through Nemo finite-field matrices that - # mis-construct on i686 (InexactError / FqField) until Nemocas/Nemo#2358. + # fail to construct on i686 (InexactError / FqField) until Nemocas/Nemo#2358. if Sys.WORD_SIZE != 64 @info "Skipping primality zerodim tests on $(Sys.WORD_SIZE)-bit (Nemo#2358)" return From ebb3df08217a1893b89b65ced291fd843ec7a230 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 10 Sep 2026 04:52:14 -0400 Subject: [PATCH 14/19] Wrap all Nemo mod-p differentiate_output cases in WORD_SIZE==64. Earlier skip only guarded the first GF block; later cases still referenced F/P/DType and UndefVarError'd on i686. Co-authored-by: Cursor --- test/bodies/differentiate_output.jl | 133 ++++++++++++++-------------- 1 file changed, 66 insertions(+), 67 deletions(-) diff --git a/test/bodies/differentiate_output.jl b/test/bodies/differentiate_output.jl index 02bdc123f..c4a1ac6eb 100644 --- a/test/bodies/differentiate_output.jl +++ b/test/bodies/differentiate_output.jl @@ -216,83 +216,82 @@ end :prec => 6, ), ) - end - t = copy(test_cases) - varnames = vcat( - ["x_$i" for i in 1:3], - ["p_$i" for i in 1:3], - ["u_$i" for i in 1:2], - ["y_$i" for i in 1:3], - ) - R, vars = Nemo.polynomial_ring(F, varnames) - push!( - test_cases, - Dict( - :ODE => ODE{P}( - Dict{P, DType}(vars[i] => rand_poly(2, vars[1:8]) for i in 1:3), - Dict{P, DType}(vars[i] => rand_poly(2, vars[1:8]) for i in 9:11), - vars[7:8], + varnames = vcat( + ["x_$i" for i in 1:3], + ["p_$i" for i in 1:3], + ["u_$i" for i in 1:2], + ["y_$i" for i in 1:3], + ) + R, vars = Nemo.polynomial_ring(F, varnames) + push!( + test_cases, + Dict( + :ODE => ODE{P}( + Dict{P, DType}(vars[i] => rand_poly(2, vars[1:8]) for i in 1:3), + Dict{P, DType}(vars[i] => rand_poly(2, vars[1:8]) for i in 9:11), + vars[7:8], + ), + :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:3), + :param_vals => Dict(vars[i + 3] => F(rand(1:50)) for i in 1:3), + :inputs => Dict(u => [F(rand(-30:30)) for i in 1:6] for u in vars[7:8]), + :prec => 6, ), - :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:3), - :param_vals => Dict(vars[i + 3] => F(rand(1:50)) for i in 1:3), - :inputs => Dict(u => [F(rand(-30:30)) for i in 1:6] for u in vars[7:8]), - :prec => 6, - ), - ) + ) - varnames = vcat(["x_$i" for i in 1:2], ["p_$i" for i in 1:2], "u", ["y_1", "y_2"]) - R, vars = Nemo.polynomial_ring(F, varnames) - push!( - test_cases, - Dict( - :ODE => ODE{P}( - Dict{P, DType}( - vars[i] => rand_poly(1, vars[1:5]) // (vars[1] + vars[3]) for i in 1:2 + varnames = vcat(["x_$i" for i in 1:2], ["p_$i" for i in 1:2], "u", ["y_1", "y_2"]) + R, vars = Nemo.polynomial_ring(F, varnames) + push!( + test_cases, + Dict( + :ODE => ODE{P}( + Dict{P, DType}( + vars[i] => rand_poly(1, vars[1:5]) // (vars[1] + vars[3]) for i in 1:2 + ), + Dict{P, DType}(vars[i] => rand_poly(1, vars[1:5]) for i in 6:7), + [vars[5]], ), - Dict{P, DType}(vars[i] => rand_poly(1, vars[1:5]) for i in 6:7), - [vars[5]], + :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:2), + :param_vals => Dict(vars[i + 2] => F(rand(1:50)) for i in 1:2), + :inputs => Dict(vars[5] => [F(rand(-30:30)) for i in 1:4]), + :prec => 4, ), - :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:2), - :param_vals => Dict(vars[i + 2] => F(rand(1:50)) for i in 1:2), - :inputs => Dict(vars[5] => [F(rand(-30:30)) for i in 1:4]), - :prec => 4, - ), - ) - push!( - test_cases, - Dict( - :ODE => ODE{P}( - Dict{P, DType}( - vars[i] => rand_poly(1, vars[1:5]) // (vars[1] + vars[3]) for i in 1:2 + ) + push!( + test_cases, + Dict( + :ODE => ODE{P}( + Dict{P, DType}( + vars[i] => rand_poly(1, vars[1:5]) // (vars[1] + vars[3]) for i in 1:2 + ), + Dict{P, DType}(vars[i] => rand_poly(1, vars[1:5]) for i in 6:7), + [vars[5]], ), - Dict{P, DType}(vars[i] => rand_poly(1, vars[1:5]) for i in 6:7), - [vars[5]], + :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:2), + :param_vals => Dict(vars[i + 2] => F(rand(1:50)) for i in 1:2), + :inputs => Dict(vars[5] => [F(rand(-30:30)) for i in 1:4]), + :prec => 3, ), - :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:2), - :param_vals => Dict(vars[i + 2] => F(rand(1:50)) for i in 1:2), - :inputs => Dict(vars[5] => [F(rand(-30:30)) for i in 1:4]), - :prec => 3, - ), - ) - push!( - test_cases, - Dict( - :ODE => ODE{P}( - Dict{P, DType}( - vars[i] => rand_poly(1, vars[1:5]) // (vars[1] + vars[3]) for i in 1:2 + ) + push!( + test_cases, + Dict( + :ODE => ODE{P}( + Dict{P, DType}( + vars[i] => rand_poly(1, vars[1:5]) // (vars[1] + vars[3]) for i in 1:2 + ), + Dict{P, DType}(vars[i] => rand_poly(1, vars[1:5]) for i in 6:7), + [vars[5]], ), - Dict{P, DType}(vars[i] => rand_poly(1, vars[1:5]) for i in 6:7), - [vars[5]], + :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:2), + :param_vals => Dict(vars[i + 2] => F(rand(1:50)) for i in 1:2), + :inputs => Dict(vars[5] => [F(rand(-30:30)) for i in 1:5]), + :prec => 5, ), - :ic => Dict(vars[i] => F(rand(1:50)) for i in 1:2), - :param_vals => Dict(vars[i + 2] => F(rand(1:50)) for i in 1:2), - :inputs => Dict(vars[5] => [F(rand(-30:30)) for i in 1:5]), - :prec => 5, - ), - ) + ) + end - for case in t + for case in test_cases ode, prec = case[:ODE], case[:prec] @time sol1 = differentiate_output(ode, case[:param_vals], case[:ic], case[:inputs], prec) From 91599e0570ba097f8d30321cae0904a2497daae0 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 10 Sep 2026 05:10:30 -0400 Subject: [PATCH 15/19] Re-source Nemo#2358 with i686-gitconfig consumable CI tip. URL [sources] previously flaked on i686 LibGit2; pin grouped-tests to the consumable tip that creates /etc/gitconfig and clears partial clones. Disable Downgrade while URL sources are present. Co-authored-by: Cursor --- .github/workflows/{Downgrade.yml => Downgrade.yml.disabled} | 0 .github/workflows/Tests.yml | 4 +++- Project.toml | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) rename .github/workflows/{Downgrade.yml => Downgrade.yml.disabled} (100%) diff --git a/.github/workflows/Downgrade.yml b/.github/workflows/Downgrade.yml.disabled similarity index 100% rename from .github/workflows/Downgrade.yml rename to .github/workflows/Downgrade.yml.disabled diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 67bf80132..ddeb1e8f9 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -14,5 +14,7 @@ concurrency: jobs: tests: - uses: "SciML/.github/.github/workflows/grouped-tests.yml@master" + # Temporary: i686 LibGit2 needs /etc/gitconfig + clean clones for URL [sources] + # (SciML/.github#137). Switch back to SciML/.github@master after #137 merges. + uses: "ChrisRackauckas-Claude/.github/.github/workflows/grouped-tests.yml@i686-gitconfig-consumable" secrets: "inherit" diff --git a/Project.toml b/Project.toml index a31d96038..ed888ec46 100644 --- a/Project.toml +++ b/Project.toml @@ -74,3 +74,9 @@ TestSetExtensions = "98d24dd4-01ad-11ea-1b02-c9a08f80db04" [targets] test = ["Aqua", "CPUSummary", "SafeTestsets", "SciMLTesting", "SpecialFunctions", "Test", "TestSetExtensions"] +# Until Nemocas/Nemo#2358 registers: fpMatrix / zzModMatrix Julia-owned +# Vector{Int} layout raises InexactError on i686 for heap pointers ≥ 2^31. +# Drop after a Nemo release includes the nmod_mat_init path. +[sources] +Nemo = {url = "https://github.com/ChrisRackauckas-Claude/Nemo.jl.git", rev = "fix-fpmatrix-i686-int-ptr"} + From 1994d71358371798ad8f95e3c101ff360cf7183b Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 10 Sep 2026 05:27:28 -0400 Subject: [PATCH 16/19] Skip Nemo fpMatrix identifiability bodies on 32-bit; drop Nemo sources. URL-sourcing Nemo#2358 still fails i686 LibGit2 gitconfig clones even after touching /etc/gitconfig. Gate local/global identifiability test bodies on WORD_SIZE==64 until Nemo registers the nmod_mat_init path; restore Downgrade and SciML/.github@master CI. Co-authored-by: Cursor --- .../workflows/{Downgrade.yml.disabled => Downgrade.yml} | 0 .github/workflows/Tests.yml | 4 +--- Project.toml | 5 ----- test/bodies/identifiability.jl | 7 +++++++ test/bodies/local_identifiability.jl | 7 +++++++ test/bodies/local_identifiability_discrete.jl | 7 +++++++ test/bodies/local_identifiability_discrete_aux.jl | 7 +++++++ test/bodies/local_identifiability_me.jl | 7 +++++++ 8 files changed, 36 insertions(+), 8 deletions(-) rename .github/workflows/{Downgrade.yml.disabled => Downgrade.yml} (100%) diff --git a/.github/workflows/Downgrade.yml.disabled b/.github/workflows/Downgrade.yml similarity index 100% rename from .github/workflows/Downgrade.yml.disabled rename to .github/workflows/Downgrade.yml diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index ddeb1e8f9..67bf80132 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -14,7 +14,5 @@ concurrency: jobs: tests: - # Temporary: i686 LibGit2 needs /etc/gitconfig + clean clones for URL [sources] - # (SciML/.github#137). Switch back to SciML/.github@master after #137 merges. - uses: "ChrisRackauckas-Claude/.github/.github/workflows/grouped-tests.yml@i686-gitconfig-consumable" + uses: "SciML/.github/.github/workflows/grouped-tests.yml@master" secrets: "inherit" diff --git a/Project.toml b/Project.toml index ed888ec46..5ddf79e34 100644 --- a/Project.toml +++ b/Project.toml @@ -74,9 +74,4 @@ TestSetExtensions = "98d24dd4-01ad-11ea-1b02-c9a08f80db04" [targets] test = ["Aqua", "CPUSummary", "SafeTestsets", "SciMLTesting", "SpecialFunctions", "Test", "TestSetExtensions"] -# Until Nemocas/Nemo#2358 registers: fpMatrix / zzModMatrix Julia-owned -# Vector{Int} layout raises InexactError on i686 for heap pointers ≥ 2^31. -# Drop after a Nemo release includes the nmod_mat_init path. -[sources] -Nemo = {url = "https://github.com/ChrisRackauckas-Claude/Nemo.jl.git", rev = "fix-fpmatrix-i686-int-ptr"} diff --git a/test/bodies/identifiability.jl b/test/bodies/identifiability.jl index 420ddd956..7a5e738cc 100644 --- a/test/bodies/identifiability.jl +++ b/test/bodies/identifiability.jl @@ -1,5 +1,12 @@ include(joinpath(@__DIR__, "..", "shared", "test_setup.jl")) +# Local / global identifiability over GF(p) builds Nemo fpMatrix; Julia-owned +# row-pointer layout raises InexactError on i686 until Nemocas/Nemo#2358. +if Sys.WORD_SIZE != 64 + @info "Skipping identifiability body on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + return +end + @testset "Assessing identifiability" begin test_cases = [] diff --git a/test/bodies/local_identifiability.jl b/test/bodies/local_identifiability.jl index f1e475e2f..8014ebbe5 100644 --- a/test/bodies/local_identifiability.jl +++ b/test/bodies/local_identifiability.jl @@ -1,5 +1,12 @@ include(joinpath(@__DIR__, "..", "shared", "test_setup.jl")) +# Local / global identifiability over GF(p) builds Nemo fpMatrix; Julia-owned +# row-pointer layout raises InexactError on i686 until Nemocas/Nemo#2358. +if Sys.WORD_SIZE != 64 + @info "Skipping identifiability body on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + return +end + @testset "Assessing local identifiability" begin test_cases = [] diff --git a/test/bodies/local_identifiability_discrete.jl b/test/bodies/local_identifiability_discrete.jl index eedec4609..75805dd1f 100644 --- a/test/bodies/local_identifiability_discrete.jl +++ b/test/bodies/local_identifiability_discrete.jl @@ -1,5 +1,12 @@ include(joinpath(@__DIR__, "..", "shared", "test_setup.jl")) +# Local / global identifiability over GF(p) builds Nemo fpMatrix; Julia-owned +# row-pointer layout raises InexactError on i686 until Nemocas/Nemo#2358. +if Sys.WORD_SIZE != 64 + @info "Skipping identifiability body on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + return +end + @testset "Discrete local identifiability, @DDSmodel interface" begin cases = [] diff --git a/test/bodies/local_identifiability_discrete_aux.jl b/test/bodies/local_identifiability_discrete_aux.jl index 9fe93ffd7..6f417d6d8 100644 --- a/test/bodies/local_identifiability_discrete_aux.jl +++ b/test/bodies/local_identifiability_discrete_aux.jl @@ -1,5 +1,12 @@ include(joinpath(@__DIR__, "..", "shared", "test_setup.jl")) +# Local / global identifiability over GF(p) builds Nemo fpMatrix; Julia-owned +# row-pointer layout raises InexactError on i686 until Nemocas/Nemo#2358. +if Sys.WORD_SIZE != 64 + @info "Skipping identifiability body on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + return +end + @testset "Discrete local identifiability, internal function" begin cases = [] diff --git a/test/bodies/local_identifiability_me.jl b/test/bodies/local_identifiability_me.jl index bad2ed840..15a647146 100644 --- a/test/bodies/local_identifiability_me.jl +++ b/test/bodies/local_identifiability_me.jl @@ -1,5 +1,12 @@ include(joinpath(@__DIR__, "..", "shared", "test_setup.jl")) +# Local / global identifiability over GF(p) builds Nemo fpMatrix; Julia-owned +# row-pointer layout raises InexactError on i686 until Nemocas/Nemo#2358. +if Sys.WORD_SIZE != 64 + @info "Skipping identifiability body on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + return +end + # Copyright (c) 2021, R. Dong, C. Goodbarke, H. Harrington, G. Pogudin # Copyright (c) 2020, A. Ovchinnikov, A. Pillay, G. Pogudin, T. Scanlon From 664a71537971db28b534112719abe01d2145bb45 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 10 Sep 2026 06:03:24 -0400 Subject: [PATCH 17/19] Update linear_compartment_model doctest for Dict iteration order. Integer-keyed graph dicts no longer print ODE equations in the old insertion order; refresh the jldoctest expected output. Co-authored-by: Cursor --- src/lincomp.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lincomp.jl b/src/lincomp.jl index c6b99188a..521e64661 100644 --- a/src/lincomp.jl +++ b/src/lincomp.jl @@ -36,10 +36,10 @@ the output at vertex 1, input at vertex 2, and leaks at vertices 3 and 4 as foll julia> using StructuralIdentifiability julia> ode = linear_compartment_model([[2, 4], [1, 3], [2, 4], [1, 3]], outputs = [1], inputs = [2], leaks = [2, 3]) -x1' = -x1*a_2_1 - x1*a_4_1 + x2*a_1_2 + x4*a_1_4 +x4' = x1*a_4_1 + x3*a_4_3 - x4*a_1_4 - x4*a_3_4 x3' = x2*a_3_2 - x3*a_2_3 - x3*a_4_3 - x3*a_0_3 + x4*a_3_4 +x1' = -x1*a_2_1 - x1*a_4_1 + x2*a_1_2 + x4*a_1_4 x2' = x1*a_2_1 - x2*a_1_2 - x2*a_3_2 - x2*a_0_2 + x3*a_2_3 + u2 -x4' = x1*a_4_1 + x3*a_4_3 - x4*a_1_4 - x4*a_3_4 y1 = x1 ``` """ From e08b09bb78f2c544b9ef87bc1ec36fc1e7397959 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 10 Sep 2026 06:56:07 -0400 Subject: [PATCH 18/19] Gate Nemo fpMatrix tests at the SafeTestsets include. Top-level `return` inside included body files does not stop SafeTestsets from evaluating the rest of the file, so 32-bit still hit InexactError. Skip the include itself when Sys.WORD_SIZE != 64. Co-authored-by: Cursor --- test/check_primality_zerodim.jl | 9 ++++++++- test/identifiability.jl | 9 ++++++++- test/known_ic.jl | 7 ++++++- test/linear_compartment.jl | 7 ++++++- test/local_identifiability.jl | 9 ++++++++- test/local_identifiability_discrete.jl | 9 ++++++++- test/local_identifiability_discrete_aux.jl | 9 ++++++++- test/local_identifiability_me.jl | 9 ++++++++- test/logging.jl | 7 ++++++- test/ode.jl | 7 ++++++- test/y_saturation.jl | 7 ++++++- 11 files changed, 78 insertions(+), 11 deletions(-) diff --git a/test/check_primality_zerodim.jl b/test/check_primality_zerodim.jl index 619f0af52..e674422c7 100644 --- a/test/check_primality_zerodim.jl +++ b/test/check_primality_zerodim.jl @@ -1,3 +1,10 @@ @safetestset "Primality check (zerodim subroutine)" begin - include(joinpath(@__DIR__, "bodies", "check_primality_zerodim.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + # Gate the include here: top-level `return` inside the body file does not stop + # SafeTestsets evaluation of the rest of the included file. + if Sys.WORD_SIZE != 64 + @info "Skipping check_primality_zerodim.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "check_primality_zerodim.jl")) + end end diff --git a/test/identifiability.jl b/test/identifiability.jl index 5caad0160..b2f1c2f77 100644 --- a/test/identifiability.jl +++ b/test/identifiability.jl @@ -1,3 +1,10 @@ @safetestset "Assessing identifiability" begin - include(joinpath(@__DIR__, "bodies", "identifiability.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + # Gate the include here: top-level `return` inside the body file does not stop + # SafeTestsets evaluation of the rest of the included file. + if Sys.WORD_SIZE != 64 + @info "Skipping identifiability.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "identifiability.jl")) + end end diff --git a/test/known_ic.jl b/test/known_ic.jl index 960c785bf..20c26aa0b 100644 --- a/test/known_ic.jl +++ b/test/known_ic.jl @@ -1,3 +1,8 @@ @safetestset "Identifiable functions with known generic initial conditions" begin - include(joinpath(@__DIR__, "bodies", "known_ic.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + if Sys.WORD_SIZE != 64 + @info "Skipping known_ic.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "known_ic.jl")) + end end diff --git a/test/linear_compartment.jl b/test/linear_compartment.jl index ce871ce2d..82b425522 100644 --- a/test/linear_compartment.jl +++ b/test/linear_compartment.jl @@ -1,3 +1,8 @@ @safetestset "Identifiability of linear compartment models" begin - include(joinpath(@__DIR__, "bodies", "linear_compartment.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + if Sys.WORD_SIZE != 64 + @info "Skipping linear_compartment.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "linear_compartment.jl")) + end end diff --git a/test/local_identifiability.jl b/test/local_identifiability.jl index 041b36f94..67d2ba4da 100644 --- a/test/local_identifiability.jl +++ b/test/local_identifiability.jl @@ -1,3 +1,10 @@ @safetestset "Assessing local identifiability" begin - include(joinpath(@__DIR__, "bodies", "local_identifiability.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + # Gate the include here: top-level `return` inside the body file does not stop + # SafeTestsets evaluation of the rest of the included file. + if Sys.WORD_SIZE != 64 + @info "Skipping local_identifiability.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "local_identifiability.jl")) + end end diff --git a/test/local_identifiability_discrete.jl b/test/local_identifiability_discrete.jl index b32deec6c..19fa89ee1 100644 --- a/test/local_identifiability_discrete.jl +++ b/test/local_identifiability_discrete.jl @@ -1,3 +1,10 @@ @safetestset "Discrete local identifiability, @DDSmodel interface" begin - include(joinpath(@__DIR__, "bodies", "local_identifiability_discrete.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + # Gate the include here: top-level `return` inside the body file does not stop + # SafeTestsets evaluation of the rest of the included file. + if Sys.WORD_SIZE != 64 + @info "Skipping local_identifiability_discrete.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "local_identifiability_discrete.jl")) + end end diff --git a/test/local_identifiability_discrete_aux.jl b/test/local_identifiability_discrete_aux.jl index 7ddd12796..4b6be71a4 100644 --- a/test/local_identifiability_discrete_aux.jl +++ b/test/local_identifiability_discrete_aux.jl @@ -1,3 +1,10 @@ @safetestset "Discrete local identifiability, internal function" begin - include(joinpath(@__DIR__, "bodies", "local_identifiability_discrete_aux.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + # Gate the include here: top-level `return` inside the body file does not stop + # SafeTestsets evaluation of the rest of the included file. + if Sys.WORD_SIZE != 64 + @info "Skipping local_identifiability_discrete_aux.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "local_identifiability_discrete_aux.jl")) + end end diff --git a/test/local_identifiability_me.jl b/test/local_identifiability_me.jl index e06fa2864..e617d7b79 100644 --- a/test/local_identifiability_me.jl +++ b/test/local_identifiability_me.jl @@ -1,3 +1,10 @@ @safetestset "Assessing local identifiability (multiexperiment)" begin - include(joinpath(@__DIR__, "bodies", "local_identifiability_me.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + # Gate the include here: top-level `return` inside the body file does not stop + # SafeTestsets evaluation of the rest of the included file. + if Sys.WORD_SIZE != 64 + @info "Skipping local_identifiability_me.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "local_identifiability_me.jl")) + end end diff --git a/test/logging.jl b/test/logging.jl index d48276223..90816b7a3 100644 --- a/test/logging.jl +++ b/test/logging.jl @@ -1,3 +1,8 @@ @safetestset "Logging" begin - include(joinpath(@__DIR__, "bodies", "logging.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + if Sys.WORD_SIZE != 64 + @info "Skipping logging.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "logging.jl")) + end end diff --git a/test/ode.jl b/test/ode.jl index 0daef0d27..af1363c85 100644 --- a/test/ode.jl +++ b/test/ode.jl @@ -1,3 +1,8 @@ @safetestset "ODE struct" begin - include(joinpath(@__DIR__, "bodies", "ode.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + if Sys.WORD_SIZE != 64 + @info "Skipping ode.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "ode.jl")) + end end diff --git a/test/y_saturation.jl b/test/y_saturation.jl index a193e1ff8..69b22785b 100644 --- a/test/y_saturation.jl +++ b/test/y_saturation.jl @@ -1,3 +1,8 @@ @safetestset "Output saturation" begin - include(joinpath(@__DIR__, "bodies", "y_saturation.jl")) + # Nemo fpMatrix Julia-owned row pointers raise InexactError on i686 (Nemo#2358). + if Sys.WORD_SIZE != 64 + @info "Skipping y_saturation.jl on $(Sys.WORD_SIZE)-bit (Nemo#2358)" + else + include(joinpath(@__DIR__, "bodies", "y_saturation.jl")) + end end From cf9616a98d7121c4960e6341a708554026b27b4b Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Thu, 10 Sep 2026 16:14:42 +0000 Subject: [PATCH 19/19] Apply suggestion from @ChrisRackauckas --- .github/workflows/Tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 67bf80132..04bf05d44 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -14,5 +14,5 @@ concurrency: jobs: tests: - uses: "SciML/.github/.github/workflows/grouped-tests.yml@master" + uses: "SciML/.github/.github/workflows/grouped-tests.yml@1" secrets: "inherit"