Skip to content

Commit

Permalink
det: avoid error when U is empty (#45)
Browse files Browse the repository at this point in the history
  • Loading branch information
timholy authored Dec 19, 2023
1 parent 4b77217 commit 71b8f32
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 2 deletions.
17 changes: 15 additions & 2 deletions src/WoodburyMatrices.jl
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,23 @@ _ldiv!(dest, W, A, B) = _ldiv!(dest, W, defaultfactor(W, A), B)

defaultfactor(::AbstractWoodbury, A) = lu(A)

det(W::AbstractWoodbury) = det(W.A)*det(W.C)/det(W.Cp)
logdet(W::AbstractWoodbury) = logdet(W.A) + logdet(W.C) - logdet(W.Cp)
function det(W::AbstractWoodbury)
ret = det(W.A)
if !isempty(W.C)
ret *= det(W.C)/det(W.Cp)
end
return ret
end
function logdet(W::AbstractWoodbury)
ret = logdet(W.A)
if !isempty(W.C)
ret += logdet(W.C) - logdet(W.Cp)
end
return ret
end
function logabsdet(W::AbstractWoodbury)
lad_A = logabsdet(W.A)
isempty(W.C) && return lad_A
lad_C = logabsdet(W.C)
lad_Cp = logabsdet(W.Cp)
lad = lad_A[1] + lad_C[1] - lad_Cp[1]
Expand Down
12 changes: 12 additions & 0 deletions test/symwoodbury.jl
Original file line number Diff line number Diff line change
Expand Up @@ -226,4 +226,16 @@ W = SymWoodbury([randpsd(50) for _ in 1:3]...)
@test W \ [13, 14, 15, 16] Matrix(W) \ [13, 14, 15, 16]
end

@testset "Empty B" begin
A = Diagonal( Float64[1,2,3,4] )
B = Matrix{Float64}(undef, 4, 0)
D = Diagonal(Float64[])

W = SymWoodbury( A, B, D)
@test W \ [13, 14, 15, 16] Matrix(W) \ [13, 14, 15, 16]
@test det(W) det(Matrix(W))
@test logdet(W) logdet(Matrix(W))
@test all(logabsdet(W) .≈ logabsdet(Matrix(W)))
end

end # @testset "SymWoodbury"
12 changes: 12 additions & 0 deletions test/woodbury.jl
Original file line number Diff line number Diff line change
Expand Up @@ -184,4 +184,16 @@ W = Woodbury([randpsd(50) for _ in 1:4]...)
@test logdet(W) log(det(W)) logdet(Array(W))
@test all(logabsdet(W) .≈ logabsdet(Array(W)))

@testset "Empty U" begin
A = Diagonal( Float64[1,2,3,4] )
B = Matrix{Float64}(undef, 4, 0)
D = Diagonal(Float64[])

W = Woodbury( A, B, D, B')
@test W \ [13, 14, 15, 16] Matrix(W) \ [13, 14, 15, 16]
@test det(W) det(Matrix(W))
@test logdet(W) logdet(Matrix(W))
@test all(logabsdet(W) .≈ logabsdet(Matrix(W)))
end

end # @testset "Woodbury"

0 comments on commit 71b8f32

Please sign in to comment.