Skip to content

Commit 392498f

Browse files
authored
Make AdaptiveLayout lazy (#144)
* Make AdaptiveLayout lazy * Update test_infql.jl * Update infqr.jl * add tests and update packages * Update infqr.jl * use LazyLayouts * increase coverage * Don't test on v1.10 yet
1 parent d76b219 commit 392498f

File tree

8 files changed

+49
-16
lines changed

8 files changed

+49
-16
lines changed

.github/workflows/ci.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ jobs:
2424
version:
2525
- '1.6'
2626
- '1'
27-
- '~1.10.0-0'
2827
os:
2928
- ubuntu-latest
3029
- macOS-latest

Project.toml

Lines changed: 6 additions & 6 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.6.21"
3+
version = "0.6.22"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -18,16 +18,16 @@ SemiseparableMatrices = "f8ebbe35-cbfb-4060-bf7f-b10e4670cf57"
1818

1919
[compat]
2020
Aqua = "0.6"
21-
ArrayLayouts = "0.8.16, 1"
21+
ArrayLayouts = "1.0.12"
2222
BandedMatrices = "0.17.19"
2323
BlockArrays = "0.16.14"
24-
BlockBandedMatrices = "0.11.5, 0.12"
24+
BlockBandedMatrices = "0.12"
2525
DSP = "0.7"
26-
FillArrays = "0.13, 1"
26+
FillArrays = "1"
2727
InfiniteArrays = "0.12"
28-
LazyArrays = "1.1.1"
28+
LazyArrays = "1.3"
2929
LazyBandedMatrices = "0.8.7"
30-
MatrixFactorizations = "0.9.6, 1, 2"
30+
MatrixFactorizations = "1, 2"
3131
SemiseparableMatrices = "0.3"
3232
julia = "1.6"
3333

src/InfiniteLinearAlgebra.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ import FillArrays: AbstractFill, getindex_value, axes_print_matrix_row
1818
import InfiniteArrays: OneToInf, InfUnitRange, Infinity, PosInfinity, InfiniteCardinal, InfStepRange, AbstractInfUnitRange, InfAxes, InfRanges
1919
import LinearAlgebra: matprod, qr, AbstractTriangular, AbstractQ, adjoint, transpose, AdjOrTrans
2020
import LazyArrays: applybroadcaststyle, CachedArray, CachedMatrix, CachedVector, DenseColumnMajor, FillLayout, ApplyMatrix, check_mul_axes, LazyArrayStyle,
21-
resizedata!, MemoryLayout,
21+
resizedata!, MemoryLayout, AbstractLazyLayout,
2222
factorize, sub_materialize, LazyLayout, LazyArrayStyle, layout_getindex,
2323
applylayout, ApplyLayout, PaddedLayout, CachedLayout, AbstractCachedVector, AbstractCachedMatrix, cacheddata, zero!, MulAddStyle, ApplyArray,
24-
LazyArray, LazyMatrix, LazyVector, paddeddata, arguments, resizedata!
24+
LazyArray, LazyMatrix, LazyVector, paddeddata, arguments, resizedata!, simplifiable, simplify, LazyLayouts
2525
import MatrixFactorizations: ul, ul!, _ul, ql, ql!, _ql, QLPackedQ, getL, getR, getQ, getU, reflector!, reflectorApply!, QL, QR, QRPackedQ,
2626
QRPackedQLayout, AdjQRPackedQLayout, QLPackedQLayout, AdjQLPackedQLayout, LayoutQ
2727

src/infcholesky.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
mutable struct AdaptiveCholeskyFactors{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: LayoutMatrix{T}
2+
mutable struct AdaptiveCholeskyFactors{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: LazyMatrix{T}
33
data::CachedMatrix{T,DM,M}
44
ncols::Int
55
end
@@ -50,6 +50,9 @@ adaptivecholesky(A) = Cholesky(AdaptiveCholeskyFactors(A), :U, 0)
5050
ArrayLayouts._cholesky(::SymTridiagonalLayout, ::NTuple{2,OneToInf{Int}}, A, ::CNoPivot) = adaptivecholesky(A)
5151
ArrayLayouts._cholesky(::SymmetricLayout{<:AbstractBandedLayout}, ::NTuple{2,OneToInf{Int}}, A, ::CNoPivot) = adaptivecholesky(A)
5252

53+
colsupport(::AdaptiveCholeskyFactors, ::OneToInf) = OneToInf()
54+
rowsupport(::AdaptiveCholeskyFactors, ::OneToInf) = OneToInf()
55+
5356
function colsupport(F::AdaptiveCholeskyFactors, j)
5457
partialcholesky!(F, maximum(j)+bandwidth(F,2))
5558
colsupport(F.data.data, j)

src/infqr.jl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ struct AdaptiveQRFactors{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: Layout
9292
data::AdaptiveQRData{T,DM,M}
9393
end
9494

95-
struct AdaptiveLayout{M} <: MemoryLayout end
95+
struct AdaptiveLayout{M} <: AbstractLazyLayout end
9696
MemoryLayout(::Type{AdaptiveQRFactors{T,DM,M}}) where {T,DM,M} = AdaptiveLayout{typeof(MemoryLayout(DM))}()
9797
triangularlayout(::Type{Tri}, ::ML) where {Tri, ML<:AdaptiveLayout} = Tri{ML}()
9898
transposelayout(A::AdaptiveLayout{ML}) where ML = AdaptiveLayout{typeof(transposelayout(ML()))}()
@@ -356,5 +356,15 @@ ldiv!(F::QR{<:Any,<:AdaptiveQRFactors}, b::LayoutVector; kwds...) = ldiv!(F.R, l
356356
factorize(A::BandedMatrix{<:Any,<:Any,<:OneToInf}) = qr(A)
357357
qr(A::SymTridiagonal{T,<:AbstractFill{T,1,Tuple{OneToInf{Int}}}}) where T = adaptiveqr(A)
358358

359-
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout}}) = ApplyArray(*, M.A, M.B)
360-
copy(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveLayout}}) = ApplyArray(*, M.A, M.B)
359+
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout}}) = Val(false)
360+
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout},<:QRPackedQLayout{<:AdaptiveLayout}}) = Val(false)
361+
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout},<:LazyLayouts}) = Val(false)
362+
simplifiable(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveLayout}}) = Val(false)
363+
simplifiable(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveLayout}}) = Val(false)
364+
365+
366+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout},<:QRPackedQLayout{<:AdaptiveLayout}}) = simplify(M)
367+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout}}) = simplify(M)
368+
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayout},<:LazyLayouts}) = simplify(M)
369+
copy(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveLayout}}) = simplify(M)
370+
copy(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveLayout}}) = simplify(M)

test/test_infcholesky.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,14 @@ import InfiniteLinearAlgebra: SymmetricBandedLayouts
3535

3636
@test cholesky(S^2).U[1:100,1:100] cholesky(Symmetric((S^2)[1:100,1:100])).U
3737
end
38+
39+
@testset "row/colsupport" begin
40+
S = Symmetric(BandedMatrix(0 => 1:∞, 2 => Ones(∞)))
41+
F = cholesky(S)
42+
@test colsupport(F.factors,5) == rowsupport(F.factors,3) == 3:5
43+
@test rowsupport(F.factors) == colsupport(F.factors) == axes(F.factors,1)
44+
45+
@test (F.U * F.U')[1:10,1:10] F.U[1:10,1:12] * F.U[1:10,1:12]'
46+
@test (F.U' * F.U)[1:10,1:10] S[1:10,1:10]
47+
end
3848
end

test/test_infql.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ using ArrayLayouts: TriangularLayout, UnknownLayout
207207
A = _BandedMatrix(Vcat(2*Ones(1,∞), ((1 ./(1:∞)).+1/4)', Ones(1,∞)./3), ℵ₀, 1, 1)
208208
Q, L = ql(A)
209209
b = [[1, 2, 3]; zeros(∞)]
210-
@test MemoryLayout(L) == TriangularLayout{'L', 'N', UnknownLayout}()
211-
@test MemoryLayout(L') == TriangularLayout{'U', 'N', UnknownLayout}()
210+
@test MemoryLayout(L) isa TriangularLayout{'L', 'N'}
211+
@test MemoryLayout(L') isa TriangularLayout{'U', 'N'}
212212
@test (Q'*b)[1:2] == ApplyArray(*,Q',b)[1:2] == [-0.,-1.]
213213
@test (L*b)[1:6] == ApplyArray(*,L,b)[1:6] == [0. , -5.25, -7.833333333333333, -2.4166666666666666, -1., 0.]
214214
@test size(ql(A).τ) == (ℵ₀, )

test/test_infqr.jl

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using InfiniteLinearAlgebra, LinearAlgebra, BandedMatrices, InfiniteArrays, MatrixFactorizations, LazyArrays,
2-
FillArrays, SpecialFunctions, Test, SemiseparableMatrices, LazyBandedMatrices, BlockArrays
2+
FillArrays, SpecialFunctions, Test, SemiseparableMatrices, LazyBandedMatrices, BlockArrays, BlockBandedMatrices, ArrayLayouts
33
import LazyArrays: colsupport, rowsupport, MemoryLayout, DenseColumnMajor, TriangularLayout, resizedata!, arguments
44
import LazyBandedMatrices: BroadcastBandedLayout, InvDiagTrav, BroadcastBandedBlockBandedLayout
55
import BandedMatrices: _BandedMatrix, _banded_qr!, BandedColumns
@@ -309,4 +309,15 @@ import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout
309309
u = \(A, [1; zeros(∞)]; tolerance=1E-8)
310310
@test A*u [1; zeros(∞)]
311311
end
312+
313+
@testset "lazy mul" begin
314+
A = BandedMatrix(1 => Ones(∞), 0 => Fill(-2,∞), -1 => Ones(∞))
315+
Q,R = qr(A)
316+
@test (Q*R)[1:10,1:10] A[1:10,1:10]
317+
@test (Q*Q)[1:10,1:10] Q[1:10,1:11]Q[1:11,1:10]
318+
# MatrixFactorizations currently catches * so this is temporary to
319+
# increase coverage
320+
@test mul(Q, Ones(∞,∞)) isa ApplyArray
321+
@test mul(Ones(∞,∞), Q) isa ApplyArray
322+
end
312323
end

0 commit comments

Comments
 (0)