Skip to content

Commit aaf9793

Browse files
authored
Special case diagonal Q in adaptive QR (#67)
* Special case diagonal Q in adaptive QR * fix routine, add test * tests pass on Julia v1.6 * import unitrange * Update runtests.jl
1 parent ea16648 commit aaf9793

File tree

7 files changed

+37
-18
lines changed

7 files changed

+37
-18
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.4.7"
3+
version = "0.4.8"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -18,7 +18,7 @@ SemiseparableMatrices = "f8ebbe35-cbfb-4060-bf7f-b10e4670cf57"
1818
[compat]
1919
ArrayLayouts = "0.5.1"
2020
BandedMatrices = "0.16"
21-
BlockArrays = "0.14.2"
21+
BlockArrays = "0.14.3"
2222
BlockBandedMatrices = "0.10"
2323
FillArrays = "0.11"
2424
InfiniteArrays = "0.9.3"

src/InfiniteLinearAlgebra.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ import BlockBandedMatrices: _BlockSkylineMatrix, _BandedMatrix, _BlockSkylineMat
3636
import SemiseparableMatrices: AbstractAlmostBandedLayout, _almostbanded_qr!
3737

3838

39+
if VERSION < v"1.6-"
40+
oneto(n) = Base.OneTo(n)
41+
else
42+
import Base: oneto, unitrange
43+
end
44+
3945
# BroadcastStyle(::Type{<:BandedMatrix{<:Any,<:Any,<:OneToInf}}) = LazyArrayStyle{2}()
4046

4147
function ArrayLayouts._power_by_squaring(_, ::NTuple{2,Infinity}, A::AbstractMatrix{T}, p::Integer) where T

src/banded/hessenbergq.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ for Typ in (:UpperHessenbergQ, :LowerHessenbergQ)
8484
end
8585

8686
size(Q::AbstractHessenbergQ, k::Integer) = length(Q.q)+1
87-
axes(Q::AbstractHessenbergQ, k::Integer) = Base.OneTo(length(Q.q)+1)
87+
axes(Q::AbstractHessenbergQ, k::Integer) = oneto(length(Q.q)+1)
8888
size(F::QLHessenberg, dim::Integer) = size(getfield(F, :factors), dim)
8989
size(F::QLHessenberg) = size(getfield(F, :factors))
9090

src/blockbanded/blockbanded.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ const OneToBlocks = BlockedUnitRange{OneToCumsum}
3333
axes(a::OneToInfBlocks) = (a,)
3434
axes(a::OneToBlocks) = (a,)
3535

36+
unitrange(b::OneToInfBlocks) = first(b):
37+
3638

3739
function copy(bc::Broadcasted{<:BroadcastStyle,<:Any,typeof(*),<:Tuple{Ones{T,1,Tuple{OneToInfBlocks}},AbstractArray{V,N}}}) where {N,T,V}
3840
a,b = bc.args
@@ -78,4 +80,4 @@ BlockArrays._last(::BlockedUnitRange, ::OneToInf) = ∞
7880
###
7981

8082
_krontrav_axes(A::NTuple{N,OneToInf{Int}}, B::NTuple{N,OneToInf{Int}}) where N =
81-
@. blockedrange(OneTo(length(A)))
83+
@. blockedrange(oneto(length(A)))

src/infqr.jl

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,9 @@ function materialize!(M::MatLmulVec{<:QRPackedQLayout{<:AdaptiveLayout},<:Padded
164164
A,B = M.A,M.B
165165
sB = B.datasize[1]
166166
partialqr!(A.factors.data,sB)
167-
jr = Base.OneTo(sB)
167+
jr = oneto(sB)
168168
m = maximum(colsupport(A,jr))
169-
kr = Base.OneTo(m)
169+
kr = oneto(m)
170170
resizedata!(B, m)
171171
b = paddeddata(B)
172172
lmul!(_view_QRPackedQ(A,kr,jr), b)
@@ -186,7 +186,12 @@ function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveLayout},<:Pad
186186
if mA != mB
187187
throw(DimensionMismatch("matrix A has dimensions ($mA,$nA) but B has dimensions ($mB, $nB)"))
188188
end
189-
sB = length(B.data)
189+
sB = B.datasize[1]
190+
l,u = bandwidths(A.factors)
191+
if l == 0 # diagonal special case
192+
return B
193+
end
194+
190195
jr = 1:min(COLGROWTH,nA)
191196

192197
@inbounds begin
@@ -287,7 +292,7 @@ end
287292
function ldiv!(R::UpperTriangular{<:Any,<:AdaptiveQRFactors}, B::CachedVector{<:Any,<:Any,<:Zeros{<:Any,1}})
288293
n = B.datasize[1]
289294
partialqr!(parent(R).data, n)
290-
materialize!(Ldiv(UpperTriangular(view(parent(R).data.data.data,OneTo(n),OneTo(n))), view(B.data,OneTo(n))))
295+
materialize!(Ldiv(UpperTriangular(view(parent(R).data.data.data,oneto(n),oneto(n))), view(B.data,oneto(n))))
291296
B
292297
end
293298

test/runtests.jl

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import BlockBandedMatrices: isblockbanded, _BlockBandedMatrix
99
import MatrixFactorizations: QLPackedQ
1010
import BandedMatrices: bandeddata, _BandedMatrix, BandedStyle
1111
import LazyArrays: colsupport, ApplyStyle, MemoryLayout, ApplyLayout, LazyArrayStyle, arguments
12-
import InfiniteArrays: OneToInf
12+
import InfiniteArrays: OneToInf, oneto
1313
import LazyBandedMatrices: BroadcastBandedBlockBandedLayout, BroadcastBandedLayout
1414

1515

@@ -40,8 +40,8 @@ end
4040

4141
@testset "∞-block arrays" begin
4242
@testset "fixed block size" begin
43-
k = Base.OneTo.(Base.OneTo(∞))
44-
n = Fill.(Base.OneTo(∞),Base.OneTo(∞))
43+
k = Base.OneTo.(oneto(∞))
44+
n = Fill.(oneto(∞),oneto(∞))
4545
@test broadcast(length,k) map(length,k) OneToInf()
4646
@test broadcast(length,n) map(length,n) OneToInf()
4747
b = mortar(Fill([1,2],∞))
@@ -52,7 +52,7 @@ end
5252
end
5353

5454
@testset "1:∞ blocks" begin
55-
a = blockedrange(Base.OneTo(∞))
55+
a = blockedrange(oneto(∞))
5656
@test axes(a,1) == a
5757
o = Ones((a,))
5858
@test Base.BroadcastStyle(typeof(a)) isa LazyArrayStyle{1}
@@ -102,8 +102,8 @@ end
102102

103103
@testset "triangle recurrences" begin
104104
@testset "n and k" begin
105-
n = mortar(Fill.(Base.OneTo(∞),Base.OneTo(∞)))
106-
k = mortar(Base.OneTo.(Base.OneTo(∞)))
105+
n = mortar(Fill.(oneto(∞),oneto(∞)))
106+
k = mortar(Base.OneTo.(oneto(∞)))
107107

108108
@test n[Block(5)] layout_getindex(n, Block(5)) view(n,Block(5)) Fill(5,5)
109109
@test k[Block(5)] layout_getindex(k, Block(5)) view(k,Block(5)) Base.OneTo(5)
@@ -135,8 +135,8 @@ end
135135
end
136136

137137
@testset "BlockHcat copyto!" begin
138-
n = mortar(Fill.(Base.OneTo(∞),Base.OneTo(∞)))
139-
k = mortar(Base.OneTo.(Base.OneTo(∞)))
138+
n = mortar(Fill.(oneto(∞),oneto(∞)))
139+
k = mortar(Base.OneTo.(oneto(∞)))
140140

141141
a = b = c = 0.0
142142
dat = BlockHcat(
@@ -160,8 +160,8 @@ end
160160

161161
@testset "BlockBanded" begin
162162
a = b = c = 0.0
163-
n = mortar(Fill.(Base.OneTo(∞),Base.OneTo(∞)))
164-
k = mortar(Base.OneTo.(Base.OneTo(∞)))
163+
n = mortar(Fill.(oneto(∞),oneto(∞)))
164+
k = mortar(Base.OneTo.(oneto(∞)))
165165
Dy = BlockBandedMatrices._BandedBlockBandedMatrix((k .+ (b+c))', axes(k,1), (-1,1), (-1,1))
166166
N = 100;
167167
@test Dy[Block.(1:N), Block.(1:N)] == BlockBandedMatrices._BandedBlockBandedMatrix((k .+ (b+c))[Block.(1:N)]', axes(k,1)[Block.(1:N)], (-1,1), (-1,1))

test/test_infqr.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@ import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout
136136
@test F.Q[1:10,1:10] == Eye(10)
137137
@test F.R[1:10,1:10] == A[1:10,1:10]
138138
end
139+
140+
@testset "diag special case" begin
141+
A = _BandedMatrix((1:∞)', ∞, 0, 0)
142+
b = [[1,2,3]; zeros(∞)]
143+
@test A \ b == [ones(3); zeros(∞)]
144+
end
139145
end
140146

141147
@testset "almost-banded" begin

0 commit comments

Comments
 (0)