Skip to content

Commit fe8c801

Browse files
committed
work on banded adaptive qr
1 parent 7ef6637 commit fe8c801

File tree

5 files changed

+43
-16
lines changed

5 files changed

+43
-16
lines changed

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
import Base.Broadcast: BroadcastStyle
88

99
import InfiniteArrays: OneToInf, InfUnitRange, Infinity, InfStepRange
10-
import FillArrays: AbstractFill
10+
import FillArrays: AbstractFill, getindex_value
1111
import BandedMatrices: BandedMatrix, _BandedMatrix, bandeddata, bandwidths
1212
import LinearAlgebra: lmul!, ldiv!, matprod, qr, AbstractTriangular, AbstractQ, adjoint, transpose
1313
import LazyArrays: CachedArray, CachedMatrix, CachedVector, DenseColumnMajor, FillLayout, ApplyMatrix, check_mul_axes, ApplyStyle, LazyArrayApplyStyle, LazyArrayStyle,
@@ -17,7 +17,7 @@ import MatrixFactorizations: ql, ql!, QLPackedQ, getL, getR, reflector!, reflect
1717

1818
import BlockArrays: BlockSizes, cumulsizes, _find_block, AbstractBlockVecOrMat, sizes_from_blocks
1919

20-
import BandedMatrices: BandedMatrix, bandwidths, AbstractBandedLayout, _banded_qr!
20+
import BandedMatrices: BandedMatrix, bandwidths, AbstractBandedLayout, _banded_qr!, _banded_qr
2121

2222
import BlockBandedMatrices: _BlockSkylineMatrix, _BandedMatrix, AbstractBlockSizes, cumulsizes, _BlockSkylineMatrix, BlockSizes, blockstart, blockstride,
2323
BlockSkylineSizes, BlockSkylineMatrix, BlockBandedMatrix, _BlockBandedMatrix, BlockTridiagonal

src/banded/infbanded.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,17 @@ const TriPertToeplitz{T} = Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple
88
const AdjTriPertToeplitz{T} = Adjoint{T,Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}}
99
const InfBandedMatrix{T,V<:AbstractMatrix{T}} = BandedMatrix{T,V,OneToInf{Int}}
1010

11+
_prepad(p, a) = Vcat(Zeros(max(p,0)), a)
12+
_prepad(p, a::Zeros{T,1}) where T = Zeros{T}(length(a)+p)
13+
_prepad(p, a::Ones{T,1}) where T = Ones{T}(length(a)+p)
14+
_prepad(p, a::AbstractFill{T,1}) where T = Fill{T}(getindex_value(a), length(a)+p)
15+
1116
function BandedMatrix{T}(kv::Tuple{Vararg{Pair{<:Integer,<:AbstractVector}}},
1217
::NTuple{2,Infinity},
1318
(l,u)::NTuple{2,Integer}) where T
1419
ks = getproperty.(kv, :first)
15-
rws = Vcat(permutedims.(getproperty.(kv, :second))...)
1620
l,u = -minimum(ks),maximum(ks)
21+
rws = Vcat(permutedims.(_prepad.(ks,getproperty.(kv, :second)))...)
1722
c = zeros(T, l+u+1, length(ks))
1823
for (k,j) in zip(u .- ks .+ 1,1:length(ks))
1924
c[k,j] = one(T)

src/infqr.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ AdaptiveQRData(A::AbstractMatrix{T}) where T = AdaptiveQRData(MemoryLayout(typeo
1515
function partialqr!(F::AdaptiveQRData{<:Any,<:BandedMatrix}, n::Int)
1616
if n > F.ncols
1717
l,u = bandwidths(F.data.array)
18-
resizedata!(F.data,n+l,n+u+l)
19-
resize!(F.τ,n)
18+
resizedata!(F.data,n+l,n+u+l);
19+
resize!(F.τ,n);
2020
= F.ncols
21-
factors = view(F.data.data,ñ+1:n+l,ñ+1:n)
22-
τ = view(F.τ,ñ+1:n)
23-
_banded_qr!(factors, τ)
21+
factors = view(F.data.data,ñ+1:n+l,ñ+1:n);
22+
τ = view(F.τ,ñ+1:n);
23+
_banded_qr!(factors, τ);
2424
# multiply remaining columns
2525
= max(ñ+1,n-l-u+1) # first column interacting with extra data
2626
Q = QRPackedQ(view(F.data.data,n̄:n+l,n̄:n), view(F.τ,n̄:n))
@@ -78,7 +78,7 @@ end
7878
getR(Q::QR, ::Tuple{OneToInf{Int},OneToInf{Int}}) where T = UpperTriangular(Q.factors)
7979

8080

81-
function qr(A::BandedMatrix{<:Any,<:Any,<:OneToInf})
81+
function _banded_qr(::NTuple{2,OneToInf{Int}}, A)
8282
data = AdaptiveQRData(A)
8383
QR(AdaptiveQRFactors(data), AdaptiveQRTau(data))
8484
end
@@ -182,4 +182,5 @@ ldiv!(dest::AbstractVector, F::QR{<:Any,<:AdaptiveQRFactors}, b::AbstractVector)
182182
ldiv!(F::QR{<:Any,<:AdaptiveQRFactors}, b::AbstractVector) = ldiv!(F.R, lmul!(F.Q',b))
183183
\(F::QR{<:Any,<:AdaptiveQRFactors}, B::AbstractVector) = ldiv!(F.R, F.Q'B)
184184

185+
185186
factorize(A::BandedMatrix{<:Any,<:Any,<:OneToInf}) = qr(A)

test/runtests.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,15 @@ import MatrixFactorizations: QLPackedQ
99
import BandedMatrices: bandeddata, _BandedMatrix
1010
import LazyArrays: colsupport, ApplyStyle, MemoryLayout
1111

12-
13-
14-
15-
1612
@testset "Algebra" begin
1713
@testset "BandedMatrix" begin
1814
A = BandedMatrix(-3 => Fill(7/10,∞), -2 => 1:∞, 1 => Fill(2im,∞))
1915
@test A isa BandedMatrix{ComplexF64}
2016
@test A[1:10,1:10] == diagm(-3 => Fill(7/10,7), -2 => 1:8, 1 => Fill(2im,9))
2117

18+
A = BandedMatrix(0 => Vcat([1,2,3],Zeros(∞)), 1 => Vcat(1, Zeros(∞)))
19+
@test A[1,2] == 1
20+
2221
A = BandedMatrix(-3 => Fill(7/10,∞), -2 => Fill(1,∞), 1 => Fill(2im,∞))
2322
Ac = BandedMatrix(A')
2423
At = BandedMatrix(transpose(A))
@@ -112,4 +111,4 @@ end
112111

113112
include("test_hessenbergq.jl")
114113
include("test_infql.jl")
115-
114+
include("test_infqr.jl")

test/test_infqr.jl

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,28 @@ import InfiniteLinearAlgebra: partialqr!, AdaptiveQRData, AdaptiveLayout
9292
J = A \ Vcat([besselj(1,z)], Zeros(∞))
9393
@test J[1:20_000] [besselj(k,z) for k=0:20_000-1]
9494
end
95-
end
9695

97-
96+
@testset "5-band" begin
97+
A = BandedMatrix(-2 => Ones(∞), -1 => Vcat(1, Zeros(∞)), 0 => Vcat([1,2,3],Zeros(∞)).+3, 1 => Vcat(1, Zeros(∞)), 2 => Ones(∞))
98+
b = Vcat([3,4,5],Zeros(∞))
99+
x = qr(A) \ b
100+
@test x[1:2000] (A[1:2000,1:2000]\b[1:2000])
101+
end
102+
103+
@testset "broadcast" begin
104+
A = BandedMatrix(0 => -2*(0:∞), 1 => Ones(∞), -1 => Ones(∞))
105+
B = BandedMatrix(-2 => Ones(∞), -1 => Vcat(1, Zeros(∞)), 0 => Vcat([1,2,3],Zeros(∞)).+3, 1 => Vcat(1, Zeros(∞)), 2 => Ones(∞))
106+
107+
AB = BroadcastArray(+,A,B)
108+
C = cache(AB);
109+
resizedata!(C,103,100); resizedata!(C,203,200);
110+
@test C[103,104] 1.0
111+
F = qr(AB);
112+
partialqr!(F.factors.data, 100);
113+
partialqr!(F.factors.data, 200);
114+
@test norm(F.factors.data.data.data)  4000
115+
b = Vcat([3,4,5],Zeros(∞))
116+
@time x = qr(AB) \ b;
117+
@test x[1:300] AB[1:300,1:300] \ b[1:300]
118+
end
119+
end

0 commit comments

Comments
 (0)