Skip to content

Commit a1ca41c

Browse files
committed
Add AdaptiveBlock/BandedLayout
1 parent 84517d2 commit a1ca41c

File tree

3 files changed

+31
-21
lines changed

3 files changed

+31
-21
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
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.9.1"
3+
version = "0.10"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

src/infqr.jl

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,20 @@ struct AdaptiveQRFactors{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: Layout
9393
data::AdaptiveQRData{T,DM,M}
9494
end
9595

96-
struct AdaptiveLayout{M} <: AbstractLazyLayout end
97-
MemoryLayout(::Type{AdaptiveQRFactors{T,DM,M}}) where {T,DM,M} = AdaptiveLayout{typeof(MemoryLayout(DM))}()
98-
triangularlayout(::Type{Tri}, ::ML) where {Tri, ML<:AdaptiveLayout} = Tri{ML}()
99-
transposelayout(A::AdaptiveLayout{ML}) where ML = AdaptiveLayout{typeof(transposelayout(ML()))}()
96+
struct AdaptiveLayout <: AbstractLazyLayout end
97+
struct AdaptiveBandedLayout <: AbstractLazyBandedLayout end
98+
struct AdaptiveBlockBandedLayout <: AbstractLazyBlockBandedLayout end
99+
100+
const AdaptiveLayouts = Union{AdaptiveLayout,AdaptiveBandedLayout,AdaptiveBlockBandedLayout}
101+
102+
adaptivelayout(_) = AdaptiveLayout()
103+
adaptivelayout(::BandedLayouts) = AdaptiveBandedLayout()
104+
adaptivelayout(::BlockBandedLayouts) = AdaptiveBlockBandedLayout()
105+
106+
107+
MemoryLayout(::Type{AdaptiveQRFactors{T,DM,M}}) where {T,DM,M} =adaptivelayout(MemoryLayout(DM))
108+
triangularlayout(::Type{Tri}, ::ML) where {Tri, ML<:AdaptiveLayouts} = Tri{ML}()
109+
transposelayout(A::AdaptiveLayouts) = A
100110

101111
size(F::AdaptiveQRFactors) = size(F.data.data)
102112
axes(F::AdaptiveQRFactors) = axes(F.data.data)
@@ -164,7 +174,7 @@ factorize_layout(::BandedLayouts, ::NTuple{2,OneToInf{Int}}, A) = qr(A)
164174
factorize_layout(::AbstractBandedLayout, ::NTuple{2,OneToInf{Int}}, A) = qr(A)
165175

166176

167-
cache_layout(::TriangularLayout{UPLO, UNIT, <:AdaptiveLayout}, A::AbstractMatrix) where {UPLO, UNIT} = A # already cached
177+
cache_layout(::TriangularLayout{UPLO, UNIT, <:AdaptiveLayouts}, A::AbstractMatrix) where {UPLO, UNIT} = A # already cached
168178

169179
partialqr!(F::QR, n) = partialqr!(F.factors, n)
170180
partialqr!(F::AdaptiveQRFactors, n) = partialqr!(F.data, n)
@@ -181,7 +191,7 @@ getindex(Q::QRPackedQ{<:Any,<:AdaptiveQRFactors,<:AdaptiveQRTau}, I::AbstractVec
181191
#########
182192

183193
_view_QRPackedQ(A, kr, jr) = QRPackedQ(view(A.factors.data.data.data,kr,jr), view(A.τ.data.τ,jr))
184-
function materialize!(M::MatLmulVec{<:QRPackedQLayout{<:AdaptiveLayout},<:AbstractPaddedLayout})
194+
function materialize!(M::MatLmulVec{<:QRPackedQLayout{<:AdaptiveLayouts},<:AbstractPaddedLayout})
185195
A,B = M.A,M.B
186196
sB = size(paddeddata(B),1)
187197
partialqr!(A.factors.data,sB)
@@ -223,7 +233,7 @@ end
223233

224234
_norm(x::Number) = abs(x)
225235

226-
function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveLayout},<:AbstractPaddedLayout}; tolerance=floatmin(real(eltype(M))))
236+
function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveLayouts},<:AbstractPaddedLayout}; tolerance=floatmin(real(eltype(M))))
227237
adjA,B = M.A,M.B
228238
COLGROWTH = 1000 # rate to grow columns
229239

@@ -274,7 +284,7 @@ function _view_QRPackedQ(A, KR::BlockRange, JR::BlockRange)
274284
QRPackedQ(view(A.factors.data.data.data,KR,JR), view(A.τ.data.τ,jr))
275285
end
276286

277-
function materialize!(M::MatLmulVec{<:QRPackedQLayout{<:AdaptiveLayout{<:AbstractBlockBandedLayout}},<:AbstractPaddedLayout})
287+
function materialize!(M::MatLmulVec{QRPackedQLayout{AdaptiveBlockBandedLayout},<:AbstractPaddedLayout})
278288
A,B_in = M.A,M.B
279289
sB = length(paddeddata(B_in))
280290
ax1,ax2 = axes(A.factors.data.data)
@@ -290,7 +300,7 @@ function materialize!(M::MatLmulVec{<:QRPackedQLayout{<:AdaptiveLayout{<:Abstrac
290300
B
291301
end
292302

293-
function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveLayout{<:AbstractBlockBandedLayout}},<:AbstractPaddedLayout}; tolerance=1E-30)
303+
function materialize!(M::MatLmulVec{AdjQRPackedQLayout{AdaptiveBlockBandedLayout},<:AbstractPaddedLayout}; tolerance=1E-30)
294304
adjA,B_in = M.A,M.B
295305
A = parent(adjA)
296306
T = eltype(M)
@@ -367,15 +377,15 @@ ldiv!(F::QR{<:Any,<:AdaptiveQRFactors}, b::LayoutVector; kwds...) = ldiv!(F.R, l
367377
factorize(A::BandedMatrix{<:Any,<:Any,<:OneToInf}) = qr(A)
368378
qr(A::SymTridiagonal{T,<:AbstractFill{T,1,Tuple{OneToInf{Int}}}}) where T = adaptiveqr(A)
369379

370-
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout}}) = Val(false)
371-
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout},<:QRPackedQLayout{<:AdaptiveLayout}}) = Val(false)
372-
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout},<:LazyLayouts}) = Val(false)
373-
simplifiable(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveLayout}}) = Val(false)
374-
simplifiable(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveLayout}}) = Val(false)
380+
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts}}) = Val(false)
381+
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts},<:QRPackedQLayout{<:AdaptiveLayouts}}) = Val(false)
382+
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts},<:LazyLayouts}) = Val(false)
383+
simplifiable(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveLayouts}}) = Val(false)
384+
simplifiable(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveLayouts}}) = Val(false)
375385

376386

377-
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout},<:QRPackedQLayout{<:AdaptiveLayout}}) = simplify(M)
378-
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout}}) = simplify(M)
379-
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout},<:LazyLayouts}) = simplify(M)
380-
copy(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveLayout}}) = simplify(M)
381-
copy(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveLayout}}) = simplify(M)
387+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts},<:QRPackedQLayout{<:AdaptiveLayouts}}) = simplify(M)
388+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts}}) = simplify(M)
389+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts},<:LazyLayouts}) = simplify(M)
390+
copy(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveLayouts}}) = simplify(M)
391+
copy(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveLayouts}}) = simplify(M)

test/test_infqr.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout
4444
@testset "col/rowsupport" begin
4545
A = _BandedMatrix(Vcat(Ones(1,∞), (1:∞)', Ones(1,∞)), ℵ₀, 1, 1)
4646
F = qr(A)
47-
@test MemoryLayout(typeof(F.factors)) isa AdaptiveLayout{BandedColumns{DenseColumnMajor}}
47+
@test MemoryLayout(typeof(F.factors)) isa AdaptiveBandedLayout
4848
@test bandwidths(F.factors) == (1,2)
4949
@test colsupport(F.factors,1) == 1:2
5050
@test colsupport(F.factors,5) == 3:6

0 commit comments

Comments
 (0)