Skip to content

Commit bd09cfa

Browse files
authored
Fix ambiguities, add Aqua tests (#39)
Fixes #35 Requires Julia 1.6+ because of Aqua & [compat] requirements.
1 parent 13b9537 commit bd09cfa

File tree

7 files changed

+41
-21
lines changed

7 files changed

+41
-21
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@ jobs:
1515
fail-fast: false
1616
matrix:
1717
version:
18-
- '1.0'
18+
- '1.6'
1919
- '1'
20-
- 'nightly'
2120
os:
2221
- ubuntu-latest
2322
arch:

Project.toml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
name = "WoodburyMatrices"
22
uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
3-
version = "0.5.5"
3+
version = "0.5.6"
44

55
[deps]
66
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
77
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
88

99
[compat]
10-
julia = "1"
10+
Aqua = "0.8"
11+
Random = "1"
12+
LinearAlgebra = "1"
13+
SparseArrays = "1"
14+
Test = "1"
15+
julia = "1.6"
1116

1217
[extras]
18+
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
1319
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1420
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1521

1622
[targets]
17-
test = ["Random", "Test"]
23+
test = ["Aqua", "Random", "Test"]

src/WoodburyMatrices.jl

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@ abstract type AbstractWoodbury{T} <: Factorization{T} end
1212
safeinv(A) = inv(A)
1313
safeinv(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-
2215
include("woodbury.jl")
2316
include("symwoodbury.jl")
2417
include("sparsefactors.jl")
@@ -64,6 +57,7 @@ function _ldiv(W::AbstractWoodbury, R::AbstractMatrix)
6457
end
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

6963
ldiv!(W::AbstractWoodbury, B::AbstractVector) = ldiv!(B, W, B)
@@ -76,18 +70,20 @@ function ldiv!(dest::AbstractVector, W::AbstractWoodbury, B::AbstractVector)
7670
return dest
7771
end
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
8983
end
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

9288
det(W::AbstractWoodbury) = det(W.A)*det(W.C)/det(W.Cp)
9389
logdet(W::AbstractWoodbury) = logdet(W.A) + logdet(W.C) - logdet(W.Cp)

src/symwoodbury.jl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,9 @@ inv(O::SymWoodbury{T,AType,BType,DType}) where {T<:Any, AType<:Any, BType<:Any,
9191
inv(O::SymWoodbury{T,AType,BType,DType}) where {T<:Any, AType<:Any, BType<:Any, DType<:SparseMatrixCSC} =
9292
calc_inv(O.A, O.B, Matrix(O.D))
9393
94-
_ldiv!(dest, W::SymWoodbury, A::AbstractMatrix, B) = _ldiv!(dest, W, defaultfactor(A), B)
95-
96-
defaultfactor(A) = bunchkaufman(A, true)
97-
defaultfactor(A::SymTridiagonal) = ldlt(A)
98-
defaultfactor(A::SparseMatrixCSC) = lu(A)
94+
defaultfactor(::SymWoodbury, A) = bunchkaufman(A, true)
95+
defaultfactor(::SymWoodbury, A::SymTridiagonal) = ldlt(A)
96+
defaultfactor(::SymWoodbury, A::SparseMatrixCSC) = lu(A)
9997
10098
"""
10199
partialInv(O)

test/runtests.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
using WoodburyMatrices
22
using LinearAlgebra, SparseArrays, Test
3+
using Aqua
34
using Random: seed!
45

6+
@testset "Aqua" begin
7+
Aqua.test_all(WoodburyMatrices)
8+
end
9+
510
# helper function for testing logdet
611
function randpsd(sidelength)
712
Q = randn(sidelength, sidelength)

test/symwoodbury.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,4 +216,15 @@ W = SymWoodbury([randpsd(50) for _ in 1:3]...)
216216
@test logdet(W) log(det(W)) logdet(Array(W))
217217
@test all(logabsdet(W) .≈ logabsdet(Array(W)))
218218

219+
@testset "Diagonal (issue #35)" begin
220+
A = Diagonal( Float64[1,2,3,4] )
221+
V = [5 6 7 8;
222+
9 10 11 12]
223+
U = V'
224+
D = Matrix( I, 2, 2 )
225+
226+
W = SymWoodbury( A, U, D )
227+
@test W \ [13, 14, 15, 16] ≈ Matrix(W) \ [13, 14, 15, 16]
228+
end
229+
219230
end # @testset "SymWoodbury"

test/woodbury.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ for elty in (Float32, Float64, ComplexF32, ComplexF64, Int)
6565
@test W'*v ≈ F'*v
6666
@test transpose(W)*v transpose(F)*v
6767
@test (W + W) \ v (2*Matrix(W)) \ v
68+
# Test a method used for ambiguity resolution
69+
if elty<:Union{Float32, Float64}
70+
R = randn(Complex{elty}, n, 2)
71+
@test W \ R Matrix(W) \ R
72+
end
6873

6974
# Diagonal matrix for A (lu(A) fails)
7075
D = Diagonal(d)

0 commit comments

Comments
 (0)