Skip to content

Commit 768594e

Browse files
authored
Add AdaptiveBlock/BandedLayout (#195)
* Add AdaptiveBlock/BandedLayout * Fix tests * Remove over-templating * start Y + I tests * Y+I fixes * avoid ambiguities * LazyArrays v2.6 * increase coverage
1 parent 84517d2 commit 768594e

File tree

7 files changed

+114
-53
lines changed

7 files changed

+114
-53
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.9.1"
3+
version = "0.10"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -26,7 +26,7 @@ FillArrays = "1.0"
2626
InfiniteArrays = "0.15"
2727
InfiniteRandomArrays = "0.2"
2828
Infinities = "0.1"
29-
LazyArrays = "2.5"
29+
LazyArrays = "2.6"
3030
LazyBandedMatrices = "0.11"
3131
LinearAlgebra = "1"
3232
MatrixFactorizations = "3.0"

src/InfiniteLinearAlgebra.jl

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,19 @@ import LazyArrays: AbstractCachedMatrix, AbstractCachedVector, AbstractLazyLayou
4040
CachedArray, CachedLayout, CachedMatrix, CachedVector, LazyArrayStyle, LazyLayout,
4141
LazyLayouts, LazyMatrix, LazyVector, AbstractPaddedLayout, PaddedColumns, _broadcast_sub_arguments,
4242
applybroadcaststyle, applylayout, arguments, cacheddata, paddeddata, resizedata!, simplifiable,
43-
simplify, islazy, islazy_layout, cache_getindex, cache_layout
43+
simplify, islazy, islazy_layout, cache_getindex, cache_layout, AbstractInvLayout
4444

45-
import LazyBandedMatrices: AbstractLazyBandedBlockBandedLayout, AbstractLazyBandedLayout, ApplyBandedLayout, BlockVec,
45+
import LazyBandedMatrices: AbstractLazyBandedBlockBandedLayout, AbstractLazyBandedLayout, AbstractLazyBlockBandedLayout, ApplyBandedLayout, BlockVec,
4646
BroadcastBandedLayout, KronTravBandedBlockBandedLayout, LazyBandedLayout,
4747
_block_interlace_axes, _krontrav_axes, krontravargs
4848

4949
const StructuredLayoutTypes{Lay} = Union{SymmetricLayout{Lay}, HermitianLayout{Lay}, TriangularLayout{'L','N',Lay}, TriangularLayout{'U','N',Lay}, TriangularLayout{'L','U',Lay}, TriangularLayout{'U','U',Lay}}
5050

51-
const BandedLayouts = Union{AbstractBandedLayout, StructuredLayoutTypes{<:AbstractBandedLayout}}
52-
51+
LazyArraysBandedMatricesExt = Base.get_extension(LazyArrays, :LazyArraysBandedMatricesExt)
52+
53+
const BandedLazyLayouts = LazyArraysBandedMatricesExt.BandedLazyLayouts
54+
const BandedLayouts = LazyArraysBandedMatricesExt.BandedLayouts
55+
const BlockBandedLayouts = Union{AbstractBlockBandedLayout, BlockLayout{<:AbstractBandedLayout}, StructuredLayoutTypes{<:AbstractBlockBandedLayout}}
5356

5457
import LinearAlgebra: AbstractQ, AdjointQ, AdjOrTrans, factorize, matprod, qr
5558

@@ -118,7 +121,7 @@ pad(c::Transpose, ax, bx) = transpose(pad(parent(c), bx, ax))
118121
pad(c::Adjoint, ax, bx) = adjoint(pad(parent(c), bx, ax))
119122
pad(c::BlockVec, ax::BlockedOneTo{Int,<:InfStepRange}) = BlockVec(pad(c.args[1], size(c.args[1],1), ∞))
120123

121-
export ∞, ContinuousSpectrumError, BlockTridiagonal
124+
export ∞, ContinuousSpectrumError, BlockTridiagonal, TridiagonalConjugation, BidiagonalConjugation
122125

123126
include("banded/hessenbergq.jl")
124127

src/banded/tridiagonalconjugation.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,14 +290,15 @@ getindex(K::SubArray{<:Any,1,<:TridiagonalConjugationBand}, k::AbstractInfUnitRa
290290
copy(A::TridiagonalConjugationBand) = A # immutable
291291

292292

293-
const TridiagonalConjugation{T} = Tridiagonal{T, TridiagonalConjugationBand{T}}
294-
const SymTridiagonalConjugation{T} = SymTridiagonal{T, TridiagonalConjugationBand{T}}
293+
# Use LazyBandedMatrices.Tridiagonal to support algebra
294+
const TridiagonalConjugation{T} = LazyBandedMatrices.Tridiagonal{T, TridiagonalConjugationBand{T}, TridiagonalConjugationBand{T}, TridiagonalConjugationBand{T}}
295+
const SymTridiagonalConjugation{T} = LazyBandedMatrices.SymTridiagonal{T, TridiagonalConjugationBand{T}, TridiagonalConjugationBand{T}}
295296
function TridiagonalConjugation(R, X, Y...)
296297
data = TridiagonalConjugationData(R, X, Y...)
297-
Tridiagonal(TridiagonalConjugationBand(data, :dl), TridiagonalConjugationBand(data, :d), TridiagonalConjugationBand(data, :du))
298+
LazyBandedMatrices.Tridiagonal(TridiagonalConjugationBand(data, :dl), TridiagonalConjugationBand(data, :d), TridiagonalConjugationBand(data, :du))
298299
end
299300

300301
function SymTridiagonalConjugation(R, X, Y...)
301302
data = TridiagonalConjugationData(R, X, Y...)
302-
SymTridiagonal(TridiagonalConjugationBand(data, :d), TridiagonalConjugationBand(data, :du))
303+
LazyBandedMatrices.SymTridiagonal(TridiagonalConjugationBand(data, :d), TridiagonalConjugationBand(data, :du))
303304
end

src/infcholesky.jl

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

2-
mutable struct AdaptiveCholeskyFactors{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: LazyMatrix{T}
3-
data::CachedMatrix{T,DM,M}
2+
mutable struct AdaptiveCholeskyFactors{T,DM<:AbstractMatrix{T}} <: LazyMatrix{T}
3+
data::CachedMatrix{T,DM}
44
ncols::Int
55
end
66

@@ -16,12 +16,29 @@ function AdaptiveCholeskyFactors(::SymmetricBandedLayouts, S::AbstractMatrix{T})
1616
AdaptiveCholeskyFactors(CachedArray(data,A), 0)
1717
end
1818
AdaptiveCholeskyFactors(A::AbstractMatrix{T}) where T = AdaptiveCholeskyFactors(MemoryLayout(A), A)
19-
MemoryLayout(::Type{AdaptiveCholeskyFactors{T,DM,M}}) where {T,DM,M} = AdaptiveLayout{typeof(MemoryLayout(DM))}()
19+
20+
struct AdaptiveCholeskyFactorsLayout <: AbstractLazyLayout end
21+
struct AdaptiveCholeskyFactorsBandedLayout <: AbstractLazyBandedLayout end
22+
struct AdaptiveCholeskyFactorsBlockBandedLayout <: AbstractLazyBlockBandedLayout end
23+
24+
const AdaptiveCholeskyFactorsLayouts = Union{AdaptiveCholeskyFactorsLayout,AdaptiveCholeskyFactorsBandedLayout,AdaptiveCholeskyFactorsBlockBandedLayout}
25+
26+
# TODO: support other than Banded
27+
# adaptivecholeskyfactorslayout(_) = AdaptiveCholeskyFactorsLayout()
28+
adaptivecholeskyfactorslayout(::BandedLayouts) = AdaptiveCholeskyFactorsBandedLayout()
29+
# adaptivecholeskyfactorslayout(::BlockBandedLayouts) = AdaptiveCholeskyFactorsBlockBandedLayout()
30+
31+
32+
MemoryLayout(::Type{AdaptiveCholeskyFactors{T,DM}}) where {T,DM} = adaptivecholeskyfactorslayout(MemoryLayout(DM))
33+
triangularlayout(::Type{Tri}, ::ML) where {Tri, ML<:AdaptiveCholeskyFactorsLayouts} = Tri{ML}()
34+
transposelayout(A::AdaptiveCholeskyFactorsLayouts) = A
2035

2136
copy(A::AdaptiveCholeskyFactors) = AdaptiveCholeskyFactors(copy(A.data), copy(A.ncols))
2237
copy(A::Adjoint{T,<:AdaptiveCholeskyFactors}) where T = copy(parent(A))'
2338
copy(A::Transpose{T,<:AdaptiveCholeskyFactors}) where T = transpose(copy(parent(A)))
2439

40+
cache_layout(::TriangularLayout{'U', 'N', AdaptiveCholeskyFactorsBandedLayout}, A::AbstractMatrix) = A # already cached
41+
2542
function partialcholesky!(F::AdaptiveCholeskyFactors{T,<:BandedMatrix}, n::Int) where T
2643
if n > F.ncols
2744
_,u = bandwidths(F.data.array)
@@ -74,7 +91,7 @@ end
7491
colsupport(F::AdjOrTrans{<:Any,<:AdaptiveCholeskyFactors}, j) = rowsupport(parent(F), j)
7592
rowsupport(F::AdjOrTrans{<:Any,<:AdaptiveCholeskyFactors}, j) = colsupport(parent(F), j)
7693

77-
function materialize!(M::MatLdivVec{<:TriangularLayout{'L','N',<:AdaptiveLayout},<:AbstractPaddedLayout})
94+
function materialize!(M::MatLdivVec{<:TriangularLayout{'L','N',<:AdaptiveCholeskyFactorsLayouts},<:AbstractPaddedLayout})
7895
A,B = M.A,M.B
7996
T = eltype(M)
8097
COLGROWTH = 1000 # rate to grow columns

src/infqr.jl

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11

2-
mutable struct AdaptiveQRData{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}}
3-
data::CachedMatrix{T,DM,M}
2+
mutable struct AdaptiveQRData{T,DM<:AbstractMatrix{T}}
3+
data::CachedMatrix{T,DM}
44
τ::Vector{T}
55
ncols::Int
66
end
77

8-
function AdaptiveQRData(::Union{SymmetricLayout{<:AbstractBandedLayout},AbstractBandedLayout}, A::AbstractMatrix{T}) where T
8+
function AdaptiveQRData(::BandedLayouts, A::AbstractMatrix{T}) where T
99
l,u = bandwidths(A)
1010
FT = float(T)
1111
data = BandedMatrix{FT}(undef,(2l+u+1,0),(l,l+u)) # pad super
@@ -89,14 +89,24 @@ partialqr!(F::AdaptiveQRData{<:Any,<:BlockSkylineMatrix}, n::Int) =
8989
partialqr!(F, findblock(axes(F.data,2), n))
9090

9191

92-
struct AdaptiveQRFactors{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: LayoutMatrix{T}
93-
data::AdaptiveQRData{T,DM,M}
92+
struct AdaptiveQRFactors{T,DM<:AbstractMatrix{T}} <: LayoutMatrix{T}
93+
data::AdaptiveQRData{T,DM}
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 AdaptiveQRFactorsLayout <: AbstractLazyLayout end
97+
struct AdaptiveQRFactorsBandedLayout <: AbstractLazyBandedLayout end
98+
struct AdaptiveQRFactorsBlockBandedLayout <: AbstractLazyBlockBandedLayout end
99+
100+
const AdaptiveQRFactorsLayouts = Union{AdaptiveQRFactorsLayout,AdaptiveQRFactorsBandedLayout,AdaptiveQRFactorsBlockBandedLayout}
101+
102+
adaptiveqrfactorslayout(_) = AdaptiveQRFactorsLayout()
103+
adaptiveqrfactorslayout(::BandedLayouts) = AdaptiveQRFactorsBandedLayout()
104+
adaptiveqrfactorslayout(::BlockBandedLayouts) = AdaptiveQRFactorsBlockBandedLayout()
105+
106+
107+
MemoryLayout(::Type{AdaptiveQRFactors{T,DM}}) where {T,DM} =adaptiveqrfactorslayout(MemoryLayout(DM))
108+
triangularlayout(::Type{Tri}, ::ML) where {Tri, ML<:AdaptiveQRFactorsLayouts} = Tri{ML}()
109+
# transposelayout(A::AdaptiveQRFactorsLayouts) = A
100110

101111
size(F::AdaptiveQRFactors) = size(F.data.data)
102112
axes(F::AdaptiveQRFactors) = axes(F.data.data)
@@ -136,8 +146,8 @@ rowsupport(F::QRPackedQ{<:Any,<:AdaptiveQRFactors}, j) = first(rowsupport(F.fact
136146
blockcolsupport(F::QRPackedQ{<:Any,<:AdaptiveQRFactors}, j) = blockcolsupport(F.factors, j)
137147

138148

139-
struct AdaptiveQRTau{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: LayoutVector{T}
140-
data::AdaptiveQRData{T,DM,M}
149+
struct AdaptiveQRTau{T,DM<:AbstractMatrix{T}} <: LayoutVector{T}
150+
data::AdaptiveQRData{T,DM}
141151
end
142152

143153
size(F::AdaptiveQRTau) = (size(F.data.data,1),)
@@ -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{'U', 'N', AdaptiveQRFactorsBandedLayout}, A::AbstractMatrix) = 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{<:AdaptiveQRFactorsLayouts},<: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{<:AdaptiveQRFactorsLayouts},<: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{AdaptiveQRFactorsBlockBandedLayout},<: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{AdaptiveQRFactorsBlockBandedLayout},<:AbstractPaddedLayout}; tolerance=1E-30)
294304
adjA,B_in = M.A,M.B
295305
A = parent(adjA)
296306
T = eltype(M)
@@ -367,15 +377,19 @@ 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)
375-
376-
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)
380+
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = Val(false)
381+
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts},<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = Val(false)
382+
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts},<:LazyLayouts}) = Val(false)
383+
simplifiable(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = Val(false)
384+
simplifiable(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = Val(false)
385+
simplifiable(M::Mul{<:AbstractInvLayout,<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = Val(false)
386+
387+
388+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}, <:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = simplify(M)
389+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = simplify(M)
390+
copy(M::Mul{<:AdaptiveQRFactorsLayouts, <:BandedLazyLayouts}) = simplify(M)
391+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}, <:BandedLazyLayouts}) = simplify(M)
392+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}, <:LazyLayouts}) = simplify(M)
393+
copy(M::Mul{<:Any, <:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = simplify(M)
394+
copy(M::Mul{<:LazyLayouts, <:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = simplify(M)
395+
copy(M::Mul{<:BandedLazyLayouts, <:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = simplify(M)

test/test_bidiagonalconjugation.jl

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -185,12 +185,15 @@ end
185185
R,X = (_BandedMatrix(Vcat(-Ones(1,∞)/2, Zeros(1,∞), Hcat(Ones(1,1),Ones(1,∞)/2)), ℵ₀, 0,2),
186186
LazyBandedMatrices.Tridiagonal(Vcat(1.0, Fill(1/2,∞)), Zeros(∞), Fill(1/2,∞)))
187187

188-
Y = TridiagonalConjugation(R, X)
189-
n = 100_000
190-
@test Y[n,n+1] 1/2
191-
192-
Y = SymTridiagonalConjugation(R, X)
193-
n = 100_000
194-
@test Y[n,n+1] 1/2
188+
for Y in (TridiagonalConjugation(R, X), SymTridiagonalConjugation(R, X))
189+
n = 100_000
190+
@test Y[n,n+1] 1/2
191+
192+
@testset "Y+I" begin
193+
@test (Y+I)[1:10,1:10] == (I+Y)[1:10,1:10] == I + Y[1:10,1:10]
194+
@test (Y-I)[1:10,1:10] == Y[1:10,1:10] - I
195+
@test (I-Y)[1:10,1:10] == I - Y[1:10,1:10]
196+
end
197+
end
195198
end
196199
end

test/test_infqr.jl

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
using InfiniteLinearAlgebra, LinearAlgebra, BandedMatrices, InfiniteArrays, MatrixFactorizations, LazyArrays,
22
FillArrays, SpecialFunctions, Test, SemiseparableMatrices, LazyBandedMatrices, BlockArrays, BlockBandedMatrices, ArrayLayouts
3-
import LazyArrays: colsupport, rowsupport, MemoryLayout, DenseColumnMajor, TriangularLayout, resizedata!, arguments
3+
import LazyArrays: colsupport, rowsupport, MemoryLayout, DenseColumnMajor, TriangularLayout, resizedata!, arguments, simplifiable
44
import LazyBandedMatrices: BroadcastBandedLayout, InvDiagTrav, BroadcastBandedBlockBandedLayout
55
import BandedMatrices: _BandedMatrix, _banded_qr!, BandedColumns
6-
import InfiniteLinearAlgebra: partialqr!, AdaptiveQRData, AdaptiveLayout, adaptiveqr
6+
import InfiniteLinearAlgebra: partialqr!, AdaptiveQRData, AdaptiveQRFactorsBandedLayout, adaptiveqr
77
import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout
88

99

@@ -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 AdaptiveQRFactorsBandedLayout
4848
@test bandwidths(F.factors) == (1,2)
4949
@test colsupport(F.factors,1) == 1:2
5050
@test colsupport(F.factors,5) == 3:6
@@ -165,6 +165,29 @@ import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout
165165
@test F\b F\view(b,:)
166166
@test_broken F\b ldiv!(F, view(copy(b),:))
167167
end
168+
169+
@testset "cache/mul" begin
170+
A = _BandedMatrix(Vcat(Ones(1,∞), (1:∞)', Ones(1,∞)), ℵ₀, 1, 1)
171+
Q,R = qr(A)
172+
@test cache(R) R
173+
174+
@test simplifiable(*, R, A) == Val(false)
175+
@test simplifiable(*, A, R) == Val(false)
176+
@test simplifiable(*, parent(R), A) == Val(false)
177+
@test simplifiable(*, A, parent(R)) == Val(false)
178+
@test simplifiable(*, inv(R), A) == Val(false)
179+
@test simplifiable(*, A, inv(R)) == Val(false)
180+
@test simplifiable(*, inv(R), Q) == Val(false)
181+
@test simplifiable(*, Q, inv(R)) == Val(false)
182+
@test simplifiable(*, Symmetric(inv(R)), Q) == Val(false)
183+
@test simplifiable(*, Q, Symmetric(inv(R))) == Val(false)
184+
@test (R * A)[1:10,1:10] R[1:10,1:11] * A[1:11,1:10]
185+
@test (Q * A)[1:10,1:10] Q[1:10,1:11] * A[1:11,1:10]
186+
@test mul(Q, Symmetric(inv(R))) isa ApplyArray # several bugs avoided heree
187+
@test mul(Symmetric(inv(R)), Q) isa ApplyArray # several bugs avoided heree
188+
@test (parent(R) * A)[1:10,1:10] parent(R)[1:10,1:11] * A[1:11,1:10]
189+
190+
end
168191
end
169192

170193
@testset "almost-banded" begin

0 commit comments

Comments
 (0)