Skip to content

Commit 6394a2f

Browse files
committed
_qr
1 parent 3b42238 commit 6394a2f

File tree

5 files changed

+39
-27
lines changed

5 files changed

+39
-27
lines changed

Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ FillArrays = "0.8.6"
2424
InfiniteArrays = "0.6.1, 0.7"
2525
LazyArrays = "0.16.1"
2626
LazyBandedMatrices = "0.2"
27+
MatrixFactorizations = "0.3.1"
2728
julia = "1.3"
2829

2930
[extras]

src/InfiniteLinearAlgebra.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Base: +, -, *, /, \, ^, OneTo, getindex, promote_op, _unsafe_getindex, pr
77
show, getproperty, copy, map
88
import Base.Broadcast: BroadcastStyle, Broadcasted, broadcasted
99

10-
import ArrayLayouts: colsupport, rowsupport, triangularlayout, MatLdivVec, triangulardata, TriangularLayout, sublayout
10+
import ArrayLayouts: colsupport, rowsupport, triangularlayout, MatLdivVec, triangulardata, TriangularLayout, sublayout, _qr
1111
import BandedMatrices: BandedMatrix, _BandedMatrix, AbstractBandedMatrix, bandeddata, bandwidths, BandedColumns, bandedcolumns,
1212
_default_banded_broadcast
1313
import FillArrays: AbstractFill, getindex_value
@@ -18,7 +18,7 @@ import LazyArrays: applybroadcaststyle, CachedArray, CachedMatrix, CachedVector,
1818
factorize, sub_materialize, LazyLayout, LazyArrayStyle, layout_getindex,
1919
@lazymul, applylayout, ApplyLayout, PaddedLayout, materialize!, zero!, MulAddStyle,
2020
LazyArray, LazyMatrix, LazyVector
21-
import MatrixFactorizations: ql, ql!, QLPackedQ, getL, getR, reflector!, reflectorApply!, QL, QR, QRPackedQ
21+
import MatrixFactorizations: ql, ql!, _ql, QLPackedQ, getL, getR, reflector!, reflectorApply!, QL, QR, QRPackedQ
2222

2323
import BlockArrays: AbstractBlockVecOrMat, sizes_from_blocks, _length, BlockedUnitRange
2424

src/infql.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ end
208208
# BlockTridiagonal
209209
####
210210

211-
function _ql(A::BlockTriPertToeplitz, d, e)
211+
function _blocktripert_ql(A, d, e)
212212
N = max(length(A.blocks.du.args[1])+1,length(A.blocks.d.args[1]),length(A.blocks.dl.args[1]))
213213
c,a,b = A[Block(N+1,N)],A[Block(N,N)],A[Block(N-1,N)]
214214
P,τ = blocktailiterate(c,a,b,d,e)
@@ -226,7 +226,7 @@ function _ql(A::BlockTriPertToeplitz, d, e)
226226
Vcat(F.τ,mortar(Fill(τ,∞)))), P[Block(1,1)], P[Block(1,2)]
227227
end
228228

229-
ql(A::BlockTriPertToeplitz) = _ql(A, A[Block(2,3)], A[Block(3,3)])[1]
229+
ql(A::BlockTriPertToeplitz) = _blocktripert_ql(A, A[Block(2,3)], A[Block(3,3)])[1]
230230

231231
ql(A::Adjoint{T,BlockTriPertToeplitz{T}}) where T = ql(BlockTridiagonal(A))
232232

src/infqr.jl

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,23 @@ function AdaptiveQRData(::AbstractAlmostBandedLayout, A::AbstractMatrix{T}) wher
1616
r = almostbandedrank(A)
1717
data = AlmostBandedMatrix{T}(undef,(2l+u+1,0),(l,l+u),r) # pad super
1818

19-
AdaptiveQRData(CachedArray(data,A), Vector{T}(), 0)
19+
AdaptiveQRData(CachedArray(data,A,(0,0)), Vector{T}(), 0)
2020
end
2121

2222
AdaptiveQRData(A::AbstractMatrix{T}) where T = AdaptiveQRData(MemoryLayout(typeof(A)), A)
2323

2424
function partialqr!(F::AdaptiveQRData{<:Any,<:BandedMatrix}, n::Int)
2525
if n > F.ncols
26-
l,u = bandwidths(F.data.array)
27-
resizedata!(F.data,n+l,n+u+l);
26+
l,u = bandwidths(F.data.data)
27+
resizedata!(F.data,n+l,n+u);
2828
resize!(F.τ,n);
2929
= F.ncols
3030
τ = view(F.τ,ñ+1:n);
3131
if l 0
3232
zero!(τ)
3333
else
34-
factors = view(F.data.data,ñ+1:n+l,ñ+1:n);
35-
_banded_qr!(factors, τ);
36-
# multiply remaining columns
37-
= max(ñ+1,n-l-u+1) # first column interacting with extra data
38-
Q = QRPackedQ(view(F.data.data,n̄:n+l,n̄:n), view(F.τ,n̄:n))
39-
lmul!(Q',view(F.data.data,n̄:n+l,n+1:n+u+l))
34+
factors = view(F.data.data,ñ+1:n+l,ñ+1:n+u);
35+
_banded_qr!(factors, τ, n-ñ)
4036
end
4137
F.ncols = n
4238
end
@@ -45,20 +41,16 @@ end
4541

4642
function partialqr!(F::AdaptiveQRData{<:Any,<:AlmostBandedMatrix}, n::Int)
4743
if n > F.ncols
48-
l,u = almostbandwidths(F.data.array)
49-
resizedata!(F.data,n+l,n+u+l)
50-
resize!(F.τ,n)
44+
l,u = almostbandwidths(F.data.data)
45+
resizedata!(F.data,n+l,n+l+u);
46+
resize!(F.τ,n);
5147
= F.ncols
5248
τ = view(F.τ,ñ+1:n)
5349
if l 0
5450
zero!(τ)
5551
else
56-
factors = view(F.data.data,ñ+1:n+l,ñ+1:n)
57-
_almostbanded_qr!(factors, τ)
58-
# multiply remaining columns
59-
= max(ñ+1,n-l-u+1) # first column interacting with extra data
60-
Q = QRPackedQ(view(F.data.data,n̄:n+l,n̄:n), view(F.τ,n̄:n))
61-
lmul!(Q',view(F.data.data,n̄:n+l,n+1:n+u+l))
52+
factors = view(F.data.data,ñ+1:n+l,ñ+1:n+l+u)
53+
_almostbanded_qr!(factors, τ, n-ñ)
6254
end
6355
F.ncols = n
6456
end
@@ -118,7 +110,8 @@ function adaptiveqr(A)
118110
QR(AdaptiveQRFactors(data), AdaptiveQRTau(data))
119111
end
120112

121-
_banded_qr(::NTuple{2,OneToInf{Int}}, A) = adaptiveqr(A)
113+
_qr(::AbstractBandedLayout, ::NTuple{2,OneToInf{Int}}, A) = adaptiveqr(A)
114+
_qr(::AbstractAlmostBandedLayout, ::NTuple{2,OneToInf{Int}}, A) = adaptiveqr(A)
122115

123116
#########
124117
# lmul!
@@ -175,11 +168,12 @@ function lmul!(adjA::Adjoint{<:Any,<:QRPackedQ{<:Any,<:AdaptiveQRFactors}}, B::C
175168

176169
@inbounds begin
177170
while first(jr) < nA
171+
j = first(jr)
178172
cs = colsupport(A.factors, last(jr))
179173
cs_max = maximum(cs)
180-
kr = first(jr):cs_max
174+
kr = j:cs_max
181175
resizedata!(B, min(cs_max,mB))
182-
if (first(jr) > sB && maximum(abs,view(B.data,colsupport(A.factors,first(jr)))) tol)
176+
if (j > sB && maximum(abs,view(B.data,j:last(colsupport(A.factors,j)))) tol)
183177
break
184178
end
185179
partialqr!(A.factors.data, min(cs_max,nA))

test/test_infqr.jl

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,26 @@ import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout
143143
@test A[1:10,1:10] isa AlmostBandedMatrix
144144
@test AlmostBandedMatrix(V) == Matrix(V) == A[1:10,1:10]
145145

146-
C = cache(A)
146+
C = cache(A);
147147
@test C[1000,1000] 999.0
148148
F = adaptiveqr(A);
149-
partialqr!(F.factors.data,10)
149+
partialqr!(F.factors.data,2);
150+
@test F.factors.data.data[1:3,1:5] qr(A[1:3,1:5]).factors
151+
partialqr!(F.factors.data,3);
152+
@test F.factors.data.data[1:4,1:6] qr(A[1:4,1:6]).factors
153+
154+
F = adaptiveqr(A);
155+
partialqr!(F.factors.data,10);
156+
@test F.factors[1:11,1:10] qr(A[1:11,1:10]).factors
157+
@test F.τ[1:10] qr(A[1:11,1:10]).τ
158+
partialqr!(F.factors.data,20);
159+
@test F.factors[1:21,1:20] qr(A[1:21,1:20]).factors
160+
161+
@test adaptiveqr(A).R[1:10,1:10] qr(A[1:11,1:10]).R
162+
163+
@test qr(A) isa MatrixFactorizations.QR{Float64,<:InfiniteLinearAlgebra.AdaptiveQRFactors}
164+
@test factorize(A) isa MatrixFactorizations.QR{Float64,<:InfiniteLinearAlgebra.AdaptiveQRFactors}
165+
166+
@test (adaptiveqr(A) \ [ℯ; zeros(∞)])[1:1000] (qr(A) \ [ℯ; zeros(∞)])[1:1000] (A \ [ℯ; zeros(∞)])[1:1000] [1/factorial(1.0k) for k=0:999]
150167
end
151168
end

0 commit comments

Comments
 (0)