Skip to content

Commit 3b42238

Browse files
committed
Start almost banded adaptive QR
1 parent 9b1561d commit 3b42238

File tree

4 files changed

+54
-12
lines changed

4 files changed

+54
-12
lines changed

Project.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ MatrixFactorizations = "a3b82374-2e81-5b9e-98ce-41277c0e4c87"
1616
SemiseparableMatrices = "f8ebbe35-cbfb-4060-bf7f-b10e4670cf57"
1717

1818
[compat]
19-
ArrayLayouts = "0.2"
20-
BandedMatrices = "0.15"
19+
ArrayLayouts = "0.2.1"
20+
BandedMatrices = "0.15.1"
2121
BlockArrays = "0.11"
2222
BlockBandedMatrices = "0.7.1"
23-
FillArrays = "0.8.4"
23+
FillArrays = "0.8.6"
2424
InfiniteArrays = "0.6.1, 0.7"
25-
LazyArrays = "0.15"
25+
LazyArrays = "0.16.1"
2626
LazyBandedMatrices = "0.2"
2727
julia = "1.3"
2828

src/InfiniteLinearAlgebra.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import LazyBandedMatrices: MulBandedLayout, BroadcastBandedLayout
2929
import BlockBandedMatrices: _BlockSkylineMatrix, _BandedMatrix, _BlockSkylineMatrix, blockstart, blockstride,
3030
BlockSkylineSizes, BlockSkylineMatrix, BlockBandedMatrix, _BlockBandedMatrix, BlockTridiagonal
3131

32+
import SemiseparableMatrices: AbstractAlmostBandedLayout, _almostbanded_qr!
3233

3334
LazyArrays.@lazymul BandedMatrix{<:Any,<:Any,<:OneToInf}
3435
*(A::BandedMatrix{<:Any,<:Any,<:OneToInf}, b::CachedVector) = apply(*,A,b)

src/infqr.jl

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ function AdaptiveQRData(::AbstractBandedLayout, A::AbstractMatrix{T}) where T
1010
data = BandedMatrix{T}(undef,(2l+u+1,0),(l,l+u)) # pad super
1111
AdaptiveQRData(CachedArray(data,A), Vector{T}(), 0)
1212
end
13+
14+
function AdaptiveQRData(::AbstractAlmostBandedLayout, A::AbstractMatrix{T}) where T
15+
l,u = almostbandwidths(A)
16+
r = almostbandedrank(A)
17+
data = AlmostBandedMatrix{T}(undef,(2l+u+1,0),(l,l+u),r) # pad super
18+
19+
AdaptiveQRData(CachedArray(data,A), Vector{T}(), 0)
20+
end
21+
1322
AdaptiveQRData(A::AbstractMatrix{T}) where T = AdaptiveQRData(MemoryLayout(typeof(A)), A)
1423

1524
function partialqr!(F::AdaptiveQRData{<:Any,<:BandedMatrix}, n::Int)
@@ -34,6 +43,28 @@ function partialqr!(F::AdaptiveQRData{<:Any,<:BandedMatrix}, n::Int)
3443
F
3544
end
3645

46+
function partialqr!(F::AdaptiveQRData{<:Any,<:AlmostBandedMatrix}, n::Int)
47+
if n > F.ncols
48+
l,u = almostbandwidths(F.data.array)
49+
resizedata!(F.data,n+l,n+u+l)
50+
resize!(F.τ,n)
51+
= F.ncols
52+
τ = view(F.τ,ñ+1:n)
53+
if l 0
54+
zero!(τ)
55+
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))
62+
end
63+
F.ncols = n
64+
end
65+
F
66+
end
67+
3768
struct AdaptiveQRFactors{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: AbstractMatrix{T}
3869
data::AdaptiveQRData{T,DM,M}
3970
end
@@ -82,11 +113,13 @@ end
82113
getR(Q::QR, ::Tuple{OneToInf{Int},OneToInf{Int}}) where T = UpperTriangular(Q.factors)
83114

84115

85-
function _banded_qr(::NTuple{2,OneToInf{Int}}, A)
116+
function adaptiveqr(A)
86117
data = AdaptiveQRData(A)
87118
QR(AdaptiveQRFactors(data), AdaptiveQRTau(data))
88119
end
89120

121+
_banded_qr(::NTuple{2,OneToInf{Int}}, A) = adaptiveqr(A)
122+
90123
#########
91124
# lmul!
92125
#########

test/test_infqr.jl

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
using InfiniteLinearAlgebra, LinearAlgebra, BandedMatrices, InfiniteArrays, MatrixFactorizations, LazyArrays, FillArrays, SpecialFunctions, Test
1+
using InfiniteLinearAlgebra, LinearAlgebra, BandedMatrices, InfiniteArrays, MatrixFactorizations, LazyArrays,
2+
FillArrays, SpecialFunctions, Test, SemiseparableMatrices
23
import LazyArrays: colsupport, rowsupport, MemoryLayout, DenseColumnMajor, TriangularLayout, resizedata!, arguments
34
import LazyBandedMatrices: BroadcastBandedLayout
45
import BandedMatrices: _BandedMatrix, _banded_qr!, BandedColumns
5-
import InfiniteLinearAlgebra: partialqr!, AdaptiveQRData, AdaptiveLayout
6-
import SemiseparableMatrices: AlmostBandedLayout
6+
import InfiniteLinearAlgebra: partialqr!, AdaptiveQRData, AdaptiveLayout, adaptiveqr
7+
import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout
78

89

910
@testset "Adaptive QR" begin
@@ -136,8 +137,15 @@ import SemiseparableMatrices: AlmostBandedLayout
136137

137138
@testset "almost-banded" begin
138139
A = Vcat(Ones(1,∞), BandedMatrix(0 => -Ones(∞), 1 => 1:∞))
139-
@test MemoryLayout(typeof(A)) == AlmostBandedLayout()
140-
B,C = arguments(A)
141-
142-
end
140+
@test MemoryLayout(typeof(A)) isa VcatAlmostBandedLayout
141+
V = view(A,1:10,1:10)
142+
@test MemoryLayout(typeof(V)) isa VcatAlmostBandedLayout
143+
@test A[1:10,1:10] isa AlmostBandedMatrix
144+
@test AlmostBandedMatrix(V) == Matrix(V) == A[1:10,1:10]
145+
146+
C = cache(A)
147+
@test C[1000,1000] 999.0
148+
F = adaptiveqr(A);
149+
partialqr!(F.factors.data,10)
150+
end
143151
end

0 commit comments

Comments
 (0)