From aa4ce894d80772ac7d2d74b0556e5a29cf4bb117 Mon Sep 17 00:00:00 2001 From: Jiahao Chen Date: Fri, 13 Feb 2015 15:41:52 -0500 Subject: [PATCH] Fix type instability in logdet(::Matrix{Complex64}) Ref: #10188 1. Adds pi*im in a type stable fashion when there are an odd number of pivots 2. Uses mod2pi instead of mod(_, 2pi) --- base/linalg/lu.jl | 7 +++++-- test/runtests.jl | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/base/linalg/lu.jl b/base/linalg/lu.jl index f045b25d1185b7..a971ce0b3c8997 100644 --- a/base/linalg/lu.jl +++ b/base/linalg/lu.jl @@ -142,9 +142,12 @@ end function logdet{T<:Complex,S}(A::LU{T,S}) n = chksquare(A) - s = sum(log(diag(A.factors))) + (bool(sum(A.ipiv .!= 1:n) % 2) ? complex(0,pi) : 0) + s = sum(log(diag(A.factors))) + if bool(sum(A.ipiv .!= 1:n) % 2) + s = Complex(real(s), imag(s)+π) + end r, a = reim(s) - a = pi-mod(pi-a,2pi) #Take principal branch with argument (-pi,pi] + a = π-mod2pi(π-a) #Take principal branch with argument (-pi,pi] complex(r,a) end diff --git a/test/runtests.jl b/test/runtests.jl index f499145432a14e..14022d2c5f7ef8 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -34,7 +34,7 @@ end if "linalg" in tests # specifically selected case filter!(x -> x != "linalg", tests) - prepend!(tests, ["linalg1", "linalg2", "linalg3", "linalg4", "linalg/lapack", "linalg/triangular", "linalg/tridiag", "linalg/pinv", "linalg/givens"]) + prepend!(tests, ["linalg1", "linalg2", "linalg3", "linalg4", "linalg/lapack", "linalg/triangular", "linalg/tridiag", "linalg/pinv", "linalg/givens", "linalg/lu"]) end net_required_for = ["socket", "parallel"]