Skip to content

Commit 74f4f35

Browse files
committed
More robust tests
1 parent 45d4af5 commit 74f4f35

File tree

2 files changed

+43
-28
lines changed

2 files changed

+43
-28
lines changed

src/lu.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using LoopVectorization
22
using TriangularSolve: ldiv!
33
using LinearAlgebra: BlasInt, BlasFloat, LU, UnitLowerTriangular, checknonsingular, BLAS,
4-
LinearAlgebra, Adjoint, Transpose, UpperTriangular
4+
LinearAlgebra, Adjoint, Transpose, UpperTriangular, AbstractVecOrMat
55
using StrideArraysCore
66
using Polyester: @batch
77

@@ -46,7 +46,8 @@ if CUSTOMIZABLE_PIVOT && isdefined(LinearAlgebra, :_ipiv_cols!)
4646
end
4747
end
4848
if CUSTOMIZABLE_PIVOT && isdefined(LinearAlgebra, :_ipiv_rows!)
49-
function LinearAlgebra._ipiv_rows!(::LU{<:Any, <:Any, NotIPIV}, ::OrdinalRange,
49+
function LinearAlgebra._ipiv_rows!(::(LU{T, <:AbstractMatrix{T}, NotIPIV} where {T}),
50+
::OrdinalRange,
5051
B::StridedVecOrMat)
5152
return B
5253
end

test/runtests.jl

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
using Test
22
import RecursiveFactorization
33
import LinearAlgebra
4-
using LinearAlgebra: norm, Adjoint, Transpose
4+
using LinearAlgebra: norm, Adjoint, Transpose, ldiv!
55
using Random
66

77
Random.seed!(12)
88

99
const baselu = LinearAlgebra.lu
1010
const mylu = RecursiveFactorization.lu
1111

12-
function testlu(A, MF, BF)
12+
function testlu(A, MF, BF, p)
1313
@test MF.info == BF.info
14-
@test norm(MF.L * MF.U - A[MF.p, :], Inf) < 200sqrt(eps(real(one(float(first(A))))))
14+
if !iszero(MF.info)
15+
return nothing
16+
end
17+
E = 20size(A, 1) * eps(real(one(float(first(A)))))
18+
@test norm(MF.L * MF.U - A[MF.p, :], Inf) < (p ? E : 10sqrt(E))
19+
if ==(size(A)...)
20+
b = ldiv!(MF, A[:, end])
21+
if all(isfinite, b)
22+
n = size(A, 2)
23+
rhs = [i == n for i in 1:n]
24+
@test brhs atol=p ? 100E : 100sqrt(E)
25+
end
26+
end
1527
nothing
1628
end
17-
testlu(A::Union{Transpose, Adjoint}, MF, BF) = testlu(parent(A), parent(MF), BF)
29+
testlu(A::Union{Transpose, Adjoint}, MF, BF, p) = testlu(parent(A), parent(MF), BF, p)
1830

1931
@testset "Test LU factorization" begin
2032
for _p in (true, false),
@@ -24,29 +36,31 @@ testlu(A::Union{Transpose, Adjoint}, MF, BF) = testlu(parent(A), parent(MF), BF)
2436
p = Val(_p)
2537
for (i, s) in enumerate([1:10; 50:80:200; 300])
2638
iseven(i) && (p = RecursiveFactorization.to_stdlib_pivot(p))
27-
siz = (s, s + 2)
28-
@info("size: $(siz[1]) × $(siz[2]), T = $T, p = $_p")
29-
if isconcretetype(T)
30-
A = rand(T, siz...)
31-
else
32-
_A = rand(siz...)
33-
A = Matrix{T}(undef, siz...)
34-
copyto!(A, _A)
39+
for m in (s, s + 2)
40+
siz = (s, m)
41+
@info("size: $(siz[1]) × $(siz[2]), T = $T, p = $_p")
42+
if isconcretetype(T)
43+
A = rand(T, siz...)
44+
else
45+
_A = rand(siz...)
46+
A = Matrix{T}(undef, siz...)
47+
copyto!(A, _A)
48+
end
49+
MF = mylu(A, p)
50+
BF = baselu(A, p)
51+
testlu(A, MF, BF, _p)
52+
testlu(A, mylu(A, p, Val(false)), BF, false)
53+
A′ = permutedims(A)
54+
MF′ = mylu(A′', p)
55+
testlu(A′', MF′, BF, _p)
56+
testlu(A′', mylu(A′', p, Val(false)), BF, false)
57+
i = rand(1:s) # test `MF.info`
58+
A[:, i] .= 0
59+
MF = mylu(A, p, check = false)
60+
BF = baselu(A, p, check = false)
61+
testlu(A, MF, BF, _p)
62+
testlu(A, mylu(A, p, Val(false), check = false), BF, false)
3563
end
36-
MF = mylu(A, p)
37-
BF = baselu(A, p)
38-
testlu(A, MF, BF)
39-
testlu(A, mylu(A, p, Val(false)), BF)
40-
A′ = permutedims(A)
41-
MF′ = mylu(A′', p)
42-
testlu(A′', MF′, BF)
43-
testlu(A′', mylu(A′', p, Val(false)), BF)
44-
i = rand(1:s) # test `MF.info`
45-
A[:, i] .= 0
46-
MF = mylu(A, p, check = false)
47-
BF = baselu(A, p, check = false)
48-
testlu(A, MF, BF)
49-
testlu(A, mylu(A, p, Val(false), check = false), BF)
5064
end
5165
end
5266
end

0 commit comments

Comments
 (0)