From 04bcd199cd037137b71cd6fb7f23b4d4e3b1652d Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 11:22:36 -0400 Subject: [PATCH 01/11] Update generic.jl --- src/generic.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generic.jl b/src/generic.jl index c8336f87..e6c8057b 100644 --- a/src/generic.jl +++ b/src/generic.jl @@ -1846,7 +1846,7 @@ julia> det(BigInt[1 0; 2 2]) # exact integer determinant function det(A::AbstractMatrix{T}) where {T} if istriu(A) || istril(A) S = promote_type(T, typeof((one(T)*zero(T) + zero(T))/one(T))) - return convert(S, det(UpperTriangular(A))) + return prod(S, @view A[diagind(A)]) end return det(lu(A; check = false)) end From c74faa175768980eddf73a6de984469a9bce03b2 Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 11:26:01 -0400 Subject: [PATCH 02/11] Create SimpleUnit.jl --- test/testhelpers/SimpleUnit.jl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 test/testhelpers/SimpleUnit.jl diff --git a/test/testhelpers/SimpleUnit.jl b/test/testhelpers/SimpleUnit.jl new file mode 100644 index 00000000..a9c57263 --- /dev/null +++ b/test/testhelpers/SimpleUnit.jl @@ -0,0 +1,17 @@ +module SimpleUnits +# a minimal unitful number type +struct SimpleUnit{pow,T<:Real} <: Number + x::T +end +SimpleUnit{pow}(x::T) where {pow,T} = SimpleUnit{pow,T}(x) +SimpleUnit{pow,T}(a::SimpleUnit{pow,S}) where {pow,T<:Real,S<:Real} = SimpleUnit{pow}(convert(T, a.x)) +Base.:+(a::SimpleUnit{pow}, b::SimpleUnit{pow}) where {pow} = SimpleUnit{pow}(a.x + b.x) +Base.:*(a::SimpleUnit{apow}, b::SimpleUnit{bpow}) where {apow,bpow} = SimpleUnit{apow+bpow}(a.x * b.x) +Base.inv(a::SimpleUnit{pow}) where {pow} = SimpleUnit{-pow}(inv(a.x)) +Base.:/(a::SimpleUnit, b::SimpleUnit) = a * inv(b) +Base.zero(::Type{SimpleUnit{pow,T}}) where {pow,T} = SimpleUnit{pow}(zero(T)) +Base.one(::Type{SimpleUnit{pow,T}}) where {pow,T} = SimpleUnit{0}(one(T)) +Base.zero(a::SimpleUnit{pow}) where {pow} = SimpleUnit{pow}(zero(a.x)) +Base.one(a::SimpleUnit) = SimpleUnit{0}(a.x) +Base.isapprox(a::SimpleUnit{pow}, b::SimpleUnit{pow}; kws...) where {pow} = isapprox(a.x, b.x; kws...) +end From 62d9ca3fed319ca8a671e39172da1d4aad3b2a45 Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 11:32:20 -0400 Subject: [PATCH 03/11] Update Furlongs.jl add rtoldefault for isapprox comparisons --- test/testhelpers/Furlongs.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/testhelpers/Furlongs.jl b/test/testhelpers/Furlongs.jl index 3ddf42bf..2ecec112 100644 --- a/test/testhelpers/Furlongs.jl +++ b/test/testhelpers/Furlongs.jl @@ -107,4 +107,6 @@ Base.muladd(x::Number, y::Number, z::Furlong) = x*y + z Base.muladd(x::Number, y::Furlong, z::Furlong) = x*y + z Base.muladd(x::Furlong, y::Number, z::Furlong) = x*y + z +Base.rtoldefault(::Type{T}) where {p,F<:AbstractFloat,T<:Furlong{p,F}} = sqrt(eps(F)) + end From 5cd6af2d826f1a6f7dc7863f5a04ba1bcd899889 Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 11:48:41 -0400 Subject: [PATCH 04/11] Update generic.jl add test for generic triangular det to check no overflow and unitful matrices --- test/generic.jl | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/generic.jl b/test/generic.jl index 73da7be4..6636d064 100644 --- a/test/generic.jl +++ b/test/generic.jl @@ -17,6 +17,7 @@ using Main.LinearAlgebraTestHelpers.OffsetArrays using Main.LinearAlgebraTestHelpers.DualNumbers using Main.LinearAlgebraTestHelpers.FillArrays using Main.LinearAlgebraTestHelpers.SizedArrays +using Main.LinearAlgebraTestHelpers.Furlongs Random.seed!(123) @@ -96,6 +97,18 @@ n = 5 # should be odd @testset "det with nonstandard Number type" begin elty <: Real && @test det(Dual.(triu(A), zero(A))) isa Dual end + if elty <: Int + @testset "det no overflow - triangular" begin + A = diagm([typemax(elty), typemax(elty)]) + @test mydet(A) ≈ mydet(float(A)) + end + end + @testset "det with units - triangular" begin + for dim in 1:10 + A = diagm(Furlong.(ones(elty, dim))) + @test det(A) == Furlong{dim}(one(elty)) + end + end end @testset "diag" begin From 5cf31ac769e75c8f6678942a59bd85f39e207631 Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 11:49:31 -0400 Subject: [PATCH 05/11] Update Furlongs.jl removed un-needed modification --- test/testhelpers/Furlongs.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/testhelpers/Furlongs.jl b/test/testhelpers/Furlongs.jl index 2ecec112..3ddf42bf 100644 --- a/test/testhelpers/Furlongs.jl +++ b/test/testhelpers/Furlongs.jl @@ -107,6 +107,4 @@ Base.muladd(x::Number, y::Number, z::Furlong) = x*y + z Base.muladd(x::Number, y::Furlong, z::Furlong) = x*y + z Base.muladd(x::Furlong, y::Number, z::Furlong) = x*y + z -Base.rtoldefault(::Type{T}) where {p,F<:AbstractFloat,T<:Furlong{p,F}} = sqrt(eps(F)) - end From 53d36c5d973e1726d1d133f9f7c0ed5ffaeae1b6 Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 11:52:30 -0400 Subject: [PATCH 06/11] Delete test/testhelpers/SimpleUnit.jl --- test/testhelpers/SimpleUnit.jl | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 test/testhelpers/SimpleUnit.jl diff --git a/test/testhelpers/SimpleUnit.jl b/test/testhelpers/SimpleUnit.jl deleted file mode 100644 index a9c57263..00000000 --- a/test/testhelpers/SimpleUnit.jl +++ /dev/null @@ -1,17 +0,0 @@ -module SimpleUnits -# a minimal unitful number type -struct SimpleUnit{pow,T<:Real} <: Number - x::T -end -SimpleUnit{pow}(x::T) where {pow,T} = SimpleUnit{pow,T}(x) -SimpleUnit{pow,T}(a::SimpleUnit{pow,S}) where {pow,T<:Real,S<:Real} = SimpleUnit{pow}(convert(T, a.x)) -Base.:+(a::SimpleUnit{pow}, b::SimpleUnit{pow}) where {pow} = SimpleUnit{pow}(a.x + b.x) -Base.:*(a::SimpleUnit{apow}, b::SimpleUnit{bpow}) where {apow,bpow} = SimpleUnit{apow+bpow}(a.x * b.x) -Base.inv(a::SimpleUnit{pow}) where {pow} = SimpleUnit{-pow}(inv(a.x)) -Base.:/(a::SimpleUnit, b::SimpleUnit) = a * inv(b) -Base.zero(::Type{SimpleUnit{pow,T}}) where {pow,T} = SimpleUnit{pow}(zero(T)) -Base.one(::Type{SimpleUnit{pow,T}}) where {pow,T} = SimpleUnit{0}(one(T)) -Base.zero(a::SimpleUnit{pow}) where {pow} = SimpleUnit{pow}(zero(a.x)) -Base.one(a::SimpleUnit) = SimpleUnit{0}(a.x) -Base.isapprox(a::SimpleUnit{pow}, b::SimpleUnit{pow}; kws...) where {pow} = isapprox(a.x, b.x; kws...) -end From 321c71093d37732351aae89f123a00ab2f253323 Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 12:28:15 -0400 Subject: [PATCH 07/11] Update generic.jl fix typo --- test/generic.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/generic.jl b/test/generic.jl index 6636d064..3a5cda26 100644 --- a/test/generic.jl +++ b/test/generic.jl @@ -100,7 +100,7 @@ n = 5 # should be odd if elty <: Int @testset "det no overflow - triangular" begin A = diagm([typemax(elty), typemax(elty)]) - @test mydet(A) ≈ mydet(float(A)) + @test det(A) ≈ det(float(A)) end end @testset "det with units - triangular" begin From 29155d4506497b764e6ced977b99b6373266076f Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 13:08:18 -0400 Subject: [PATCH 08/11] Update generic.jl use `convert` as a more generic constructor --- src/generic.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generic.jl b/src/generic.jl index e6c8057b..e6afcc3f 100644 --- a/src/generic.jl +++ b/src/generic.jl @@ -1846,7 +1846,7 @@ julia> det(BigInt[1 0; 2 2]) # exact integer determinant function det(A::AbstractMatrix{T}) where {T} if istriu(A) || istril(A) S = promote_type(T, typeof((one(T)*zero(T) + zero(T))/one(T))) - return prod(S, @view A[diagind(A)]) + return prod(Base.Fix1(convert, S), @view A[diagind(A)]) end return det(lu(A; check = false)) end From 93f7b30a13844462c87ec2a2309e7ef875eb1981 Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 14:16:25 -0400 Subject: [PATCH 09/11] Update test/generic.jl Co-authored-by: Steven G. Johnson --- test/generic.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/generic.jl b/test/generic.jl index 3a5cda26..0d959280 100644 --- a/test/generic.jl +++ b/test/generic.jl @@ -100,7 +100,7 @@ n = 5 # should be odd if elty <: Int @testset "det no overflow - triangular" begin A = diagm([typemax(elty), typemax(elty)]) - @test det(A) ≈ det(float(A)) + @test det(A) == det(float(A)) end end @testset "det with units - triangular" begin From b8006e32c5b1d23efc1b592684172171a44b3ce7 Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 14:24:05 -0400 Subject: [PATCH 10/11] Update generic.jl fix 0-d case --- src/generic.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generic.jl b/src/generic.jl index e6afcc3f..4b78ee90 100644 --- a/src/generic.jl +++ b/src/generic.jl @@ -1846,7 +1846,7 @@ julia> det(BigInt[1 0; 2 2]) # exact integer determinant function det(A::AbstractMatrix{T}) where {T} if istriu(A) || istril(A) S = promote_type(T, typeof((one(T)*zero(T) + zero(T))/one(T))) - return prod(Base.Fix1(convert, S), @view A[diagind(A)]) + return prod(Base.Fix1(convert, S), @view A[diagind(A)]; init=one(S)) end return det(lu(A; check = false)) end From 58d511531d9266a79a435ed6504401fb95f381f2 Mon Sep 17 00:00:00 2001 From: Lorenzo Van Munoz <66997677+lxvm@users.noreply.github.com> Date: Thu, 14 Aug 2025 16:29:17 -0400 Subject: [PATCH 11/11] Update test/generic.jl Co-authored-by: Steven G. Johnson --- test/generic.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/generic.jl b/test/generic.jl index 0d959280..0570b8db 100644 --- a/test/generic.jl +++ b/test/generic.jl @@ -104,7 +104,7 @@ n = 5 # should be odd end end @testset "det with units - triangular" begin - for dim in 1:10 + for dim in 0:4 A = diagm(Furlong.(ones(elty, dim))) @test det(A) == Furlong{dim}(one(elty)) end