@@ -12,13 +12,6 @@ abstract type AbstractWoodbury{T} <: Factorization{T} end
1212safeinv(A) = inv(A)
1313safeinv(A:: SparseMatrixCSC ) = safeinv(Matrix(A))
1414
15- myldiv!(A, B) = ldiv!(A, B)
16- myldiv!(dest, A, B) = ldiv!(dest, A, B)
17- if VERSION <= v" 1.4.0-DEV.635"
18- myldiv!(A:: Diagonal , B) = (B .= A. diag .\ B)
19- myldiv!(dest, A:: Diagonal , B) = (dest .= A. diag .\ B)
20- end
21-
2215include(" woodbury.jl" )
2316include(" symwoodbury.jl" )
2417include(" sparsefactors.jl" )
@@ -64,6 +57,7 @@ function _ldiv(W::AbstractWoodbury, R::AbstractMatrix)
6457end
6558
6659\ (W:: AbstractWoodbury , R:: AbstractMatrix ) = _ldiv(W, R)
60+ \ (W:: AbstractWoodbury{T} , R:: Matrix{Complex{T}} ) where T<: Union{Float32, Float64} = _ldiv(W, R) # ambiguity resolution
6761\ (W:: AbstractWoodbury , D:: Diagonal ) = _ldiv(W, D)
6862
6963ldiv!(W:: AbstractWoodbury , B:: AbstractVector ) = ldiv!(B, W, B)
@@ -76,18 +70,20 @@ function ldiv!(dest::AbstractVector, W::AbstractWoodbury, B::AbstractVector)
7670 return dest
7771end
7872
79- function _ldiv!(dest, W, A:: Union{Factorization,Diagonal} , B)
80- myldiv !(W. tmpN1, A, B)
73+ function _ldiv!(dest, W:: AbstractWoodbury , A:: Union{Factorization,Diagonal} , B)
74+ ldiv !(W. tmpN1, A, B)
8175 mul!(W. tmpk1, W. V, W. tmpN1)
8276 mul!(W. tmpk2, W. Cp, W. tmpk1)
8377 mul!(W. tmpN2, W. U, W. tmpk2)
84- myldiv !(A, W. tmpN2)
78+ ldiv !(A, W. tmpN2)
8579 for i = 1 : length(W. tmpN2)
8680 @inbounds dest[i] = W. tmpN1[i] - W. tmpN2[i]
8781 end
8882 return dest
8983end
90- _ldiv!(dest, W, A, B) = _ldiv!(dest, W, lu(A), B)
84+ _ldiv!(dest, W, A, B) = _ldiv!(dest, W, defaultfactor(W, A), B)
85+
86+ defaultfactor(:: AbstractWoodbury , A) = lu(A)
9187
9288det(W:: AbstractWoodbury ) = det(W. A)* det(W. C)/ det(W. Cp)
9389logdet(W:: AbstractWoodbury ) = logdet(W. A) + logdet(W. C) - logdet(W. Cp)
0 commit comments