Skip to content

Commit 90002ca

Browse files
authored
Support tolerance in banded adaptive qr (#121)
* Support tolerance in banded adaptive qr * Update Project.toml * add tolerance test * v0.6.13
1 parent 66b2444 commit 90002ca

File tree

3 files changed

+12
-9
lines changed

3 files changed

+12
-9
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "InfiniteLinearAlgebra"
22
uuid = "cde9dba0-b1de-11e9-2c62-0bab9446c55c"
3-
version = "0.6.12"
3+
version = "0.6.13"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -18,7 +18,7 @@ SemiseparableMatrices = "f8ebbe35-cbfb-4060-bf7f-b10e4670cf57"
1818

1919
[compat]
2020
Aqua = "0.5"
21-
ArrayLayouts = "0.8.11"
21+
ArrayLayouts = "0.8.16"
2222
BandedMatrices = "0.17"
2323
BlockArrays = "0.16.14"
2424
BlockBandedMatrices = "0.11.5"

src/infqr.jl

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,9 @@ end
205205

206206
_norm(x::Number) = abs(x)
207207

208-
function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveLayout},<:PaddedLayout})
208+
function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveLayout},<:PaddedLayout}; tolerance=floatmin(real(eltype(M))))
209209
adjA,B = M.A,M.B
210-
T = eltype(M)
211210
COLGROWTH = 1000 # rate to grow columns
212-
tol = floatmin(real(T))
213211

214212
require_one_based_indexing(B)
215213
A = adjA.parent
@@ -235,7 +233,7 @@ function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveLayout},<:Pad
235233
kr = j:cs_max
236234
resizedata!(B, min(cs_max,mB))
237235
Bdata = paddeddata(B)
238-
if (j > sB && maximum(_norm,view(Bdata,j:last(colsupport(A.factors,j)))) tol)
236+
if (j > sB && maximum(_norm,view(Bdata,j:last(colsupport(A.factors,j)))) tolerance)
239237
break
240238
end
241239
partialqr!(A.factors.data, min(cs_max,nA))
@@ -244,7 +242,7 @@ function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveLayout},<:Pad
244242
jr = last(jr)+1:min(last(jr)+COLGROWTH,nA)
245243
end
246244
end
247-
resizedata_chop!(B, tol)
245+
resizedata_chop!(B, tolerance)
248246
end
249247

250248
function resizedata!(B::PseudoBlockVector, M::Block{1})
@@ -341,8 +339,7 @@ end
341339

342340

343341

344-
ldiv!(dest::AbstractVector, F::QR{<:Any,<:AdaptiveQRFactors}, b::AbstractVector) =
345-
ldiv!(F, copyto!(dest, b))
342+
ldiv!(dest::AbstractVector, F::QR{<:Any,<:AdaptiveQRFactors}, b::AbstractVector; kwds...) = ldiv!(F, copyto!(dest, b); kwds...)
346343
ldiv!(F::QR{<:Any,<:AdaptiveQRFactors}, b::AbstractVector; kwds...) = ldiv!(F.R, lmul!(F.Q',b; kwds...))
347344
ldiv!(F::QR{<:Any,<:AdaptiveQRFactors}, b::LayoutVector; kwds...) = ldiv!(F.R, lmul!(F.Q',b; kwds...))
348345
\(F::QR{<:Any,<:AdaptiveQRFactors}, B::AbstractVector; kwds...) = ldiv!(F.R, *(F.Q', B; kwds...))

test/test_infqr.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,4 +303,10 @@ import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout
303303
@test (Q*R)[1:10,1:10] A[1:10,1:10]
304304
@test (R*Q)[1:10,1:10] LazyBandedMatrices.SymTridiagonal((R*Q)[1:10,1:10])
305305
end
306+
307+
@testset "tolerance" begin
308+
A = BandedMatrix(1 => Ones(∞), 0 => Fill(-2,∞), -1 => Ones(∞))
309+
u = \(A, [1; zeros(∞)]; tolerance=1E-8)
310+
@test A*u [1; zeros(∞)]
311+
end
306312
end

0 commit comments

Comments
 (0)