Skip to content

Commit 9be3bfe

Browse files
authored
Dl/blockbandedqr (#29)
* Block banded QR * Block adaptive QR * Update test_infqr.jl * Block-+ adaptive QR * AbstractQ * Update Project.toml * Update runtests.jl * Tests pass * Update Project.toml * Update Project.toml
1 parent 75ada18 commit 9be3bfe

File tree

9 files changed

+288
-91
lines changed

9 files changed

+288
-91
lines changed

Project.toml

Lines changed: 10 additions & 10 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.3.1"
3+
version = "0.3.2"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -16,16 +16,16 @@ MatrixFactorizations = "a3b82374-2e81-5b9e-98ce-41277c0e4c87"
1616
SemiseparableMatrices = "f8ebbe35-cbfb-4060-bf7f-b10e4670cf57"
1717

1818
[compat]
19-
ArrayLayouts = "0.2.4"
20-
BandedMatrices = "0.15.3"
21-
BlockArrays = "0.12"
22-
BlockBandedMatrices = "0.8"
23-
FillArrays = "0.8.6"
19+
ArrayLayouts = "0.3"
20+
BandedMatrices = "0.15.7"
21+
BlockArrays = "0.12.6"
22+
BlockBandedMatrices = "0.8.4"
23+
FillArrays = "0.8.8"
2424
InfiniteArrays = "0.7"
25-
LazyArrays = "0.16.5"
26-
LazyBandedMatrices = "0.2.6"
27-
MatrixFactorizations = "0.3.1"
28-
SemiseparableMatrices = "0.0.1"
25+
LazyArrays = "0.16.8"
26+
LazyBandedMatrices = "0.2.8"
27+
MatrixFactorizations = "0.4.1"
28+
SemiseparableMatrices = "0.1"
2929
julia = "1.3"
3030

3131
[extras]

src/InfiniteLinearAlgebra.jl

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import Base: +, -, *, /, \, ^, OneTo, getindex, promote_op, _unsafe_getindex, pr
77
show, getproperty, copy, map, require_one_based_indexing
88
import Base.Broadcast: BroadcastStyle, Broadcasted, broadcasted
99

10-
import ArrayLayouts: colsupport, rowsupport, triangularlayout, MatLdivVec, triangulardata, TriangularLayout, sublayout, _qr
10+
import ArrayLayouts: colsupport, rowsupport, triangularlayout, MatLdivVec, triangulardata, TriangularLayout, sublayout, _qr,
11+
MatLmulVec, MatLmulMat, AbstractQLayout, materialize!
1112
import BandedMatrices: BandedMatrix, _BandedMatrix, AbstractBandedMatrix, bandeddata, bandwidths, BandedColumns, bandedcolumns,
1213
_default_banded_broadcast
1314
import FillArrays: AbstractFill, getindex_value
@@ -16,18 +17,20 @@ import LinearAlgebra: lmul!, ldiv!, matprod, qr, AbstractTriangular, AbstractQ,
1617
import LazyArrays: applybroadcaststyle, CachedArray, CachedMatrix, CachedVector, DenseColumnMajor, FillLayout, ApplyMatrix, check_mul_axes, ApplyStyle, LazyArrayApplyStyle, LazyArrayStyle,
1718
resizedata!, MemoryLayout, mulapplystyle, LmulStyle, RmulStyle,
1819
factorize, sub_materialize, LazyLayout, LazyArrayStyle, layout_getindex,
19-
@lazymul, applylayout, ApplyLayout, PaddedLayout, materialize!, zero!, MulAddStyle,
20-
LazyArray, LazyMatrix, LazyVector
21-
import MatrixFactorizations: ql, ql!, _ql, QLPackedQ, getL, getR, reflector!, reflectorApply!, QL, QR, QRPackedQ
20+
@lazymul, applylayout, ApplyLayout, PaddedLayout, zero!, MulAddStyle,
21+
LazyArray, LazyMatrix, LazyVector, paddeddata
22+
import MatrixFactorizations: ql, ql!, _ql, QLPackedQ, getL, getR, reflector!, reflectorApply!, QL, QR, QRPackedQ,
23+
QRPackedQLayout, AdjQRPackedQLayout, QLPackedQLayout, AdjQLPackedQLayout, LayoutQ
2224

23-
import BlockArrays: AbstractBlockVecOrMat, sizes_from_blocks, _length, BlockedUnitRange
25+
import BlockArrays: AbstractBlockVecOrMat, sizes_from_blocks, _length, BlockedUnitRange, blockcolsupport
2426

2527
import BandedMatrices: BandedMatrix, bandwidths, AbstractBandedLayout, _banded_qr!, _banded_qr, _BandedMatrix
2628

27-
import LazyBandedMatrices: MulBandedLayout, BroadcastBandedLayout
29+
import LazyBandedMatrices: MulBandedLayout, BroadcastBandedLayout, _krontrav_axes
2830

2931
import BlockBandedMatrices: _BlockSkylineMatrix, _BandedMatrix, _BlockSkylineMatrix, blockstart, blockstride,
30-
BlockSkylineSizes, BlockSkylineMatrix, BlockBandedMatrix, _BlockBandedMatrix, BlockTridiagonal
32+
BlockSkylineSizes, BlockSkylineMatrix, BlockBandedMatrix, _BlockBandedMatrix, BlockTridiagonal,
33+
AbstractBlockBandedLayout, _blockbanded_qr!, BlockBandedLayout
3134

3235
import SemiseparableMatrices: AbstractAlmostBandedLayout, _almostbanded_qr!
3336

@@ -78,5 +81,13 @@ broadcasted(::LazyArrayStyle{1}, ::typeof(length), A::BroadcastArray{<:Fill,1,Ty
7881

7982
BlockArrays._length(::BlockedUnitRange, ::OneToInf) =
8083
BlockArrays._last(::BlockedUnitRange, ::OneToInf) =
84+
85+
###
86+
# KronTrav
87+
###
88+
89+
_krontrav_axes(A::NTuple{N,OneToInf{Int}}, B::NTuple{N,OneToInf{Int}}) where N =
90+
@. blockedrange(OneTo(length(A)))
91+
8192

8293
end # module

src/banded/hessenbergq.jl

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
isorthogonal(::AbstractQ) = true
22
isorthogonal(q) = q'q I
33

4+
"""
5+
QLHessenberg(factors, q)
46
7+
represents a Hessenberg QL factorization where factors contains L in its
8+
lower triangular components and q is a vector of 2x2 orthogonal transformations
9+
whose product gives Q.
10+
"""
511
struct QLHessenberg{T,S<:AbstractMatrix{T},QT<:AbstractVector{<:AbstractMatrix{T}}} <: Factorization{T}
612
factors::S
713
q::QT
@@ -43,8 +49,8 @@ end
4349
end
4450
@inline getQ(F::QLHessenberg, _) = LowerHessenbergQ(F.q)
4551

46-
getL(F::QLHessenberg) = getL(F, axes(F.factors))
47-
getQ(F::QLHessenberg) = getQ(F, axes(F.factors))
52+
getL(F::QLHessenberg) = getL(F, size(F.factors))
53+
getQ(F::QLHessenberg) = getQ(F, size(F.factors))
4854

4955
function getproperty(F::QLHessenberg, d::Symbol)
5056
if d == :L
@@ -59,7 +65,7 @@ end
5965
Base.propertynames(F::QLHessenberg, private::Bool=false) =
6066
(:L, :Q, (private ? fieldnames(typeof(F)) : ())...)
6167

62-
abstract type AbstractHessenbergQ{T} <: AbstractQ{T} end
68+
abstract type AbstractHessenbergQ{T} <: LayoutQ{T} end
6369

6470
for Typ in (:UpperHessenbergQ, :LowerHessenbergQ)
6571
@eval begin
@@ -78,6 +84,7 @@ for Typ in (:UpperHessenbergQ, :LowerHessenbergQ)
7884
end
7985

8086
size(Q::AbstractHessenbergQ, k::Integer) = length(Q.q)+1
87+
axes(Q::AbstractHessenbergQ, k::Integer) = Base.OneTo(length(Q.q)+1)
8188
size(F::QLHessenberg, dim::Integer) = size(getfield(F, :factors), dim)
8289
size(F::QLHessenberg) = size(getfield(F, :factors))
8390

@@ -90,17 +97,14 @@ adjoint(Q::LowerHessenbergQ) = UpperHessenbergQ(adjoint.(Q.q))
9097
check_mul_axes(A::AbstractHessenbergQ, B, C...) =
9198
axes(A,2) == axes(B,1) || throw(DimensionMismatch("Second axis of A, $(axes(A,2)), and first axis of B, $(axes(B,1)) must match"))
9299

93-
@lazymul AbstractHessenbergQ
100+
struct HessenbergQLayout{UPLO} <: AbstractQLayout end
94101

95-
# ambiguities
96-
for Arr in (:AbstractBandedMatrix, :StridedVector, :StridedMatrix, :(BandedMatrix{<:Any,<:Any,<:OneToInf}))
97-
@eval begin
98-
*(A::AbstractHessenbergQ, B::$Arr) = apply(*, A, B)
99-
*(A::$Arr, B::AbstractHessenbergQ) = apply(*, A, B)
100-
end
101-
end
102+
MemoryLayout(::Type{<:UpperHessenbergQ}) = HessenbergQLayout{'U'}()
103+
MemoryLayout(::Type{<:LowerHessenbergQ}) = HessenbergQLayout{'L'}()
102104

103-
function lmul!(Q::LowerHessenbergQ{T}, x::AbstractVector) where T
105+
function materialize!(L::MatLmulVec{<:HessenbergQLayout{'L'}})
106+
Q, x = L.A,L.B
107+
T = eltype(Q)
104108
t = Array{T}(undef, 2)
105109
nz = nzzeros(x,1)
106110
for n = 1:length(Q.q)
@@ -112,7 +116,9 @@ function lmul!(Q::LowerHessenbergQ{T}, x::AbstractVector) where T
112116
x
113117
end
114118

115-
function lmul!(Q::UpperHessenbergQ{T}, x::AbstractVector) where T
119+
function materialize!(L::MatLmulVec{<:HessenbergQLayout{'U'}})
120+
Q, x = L.A,L.B
121+
T = eltype(Q)
116122
t = Array{T}(undef, 2)
117123
for n = min(length(Q.q),nzzeros(x,1)):-1:1
118124
v = view(x, n:n+1)
@@ -122,9 +128,10 @@ function lmul!(Q::UpperHessenbergQ{T}, x::AbstractVector) where T
122128
x
123129
end
124130

125-
function lmul!(Q::AbstractHessenbergQ, X::AbstractMatrix)
131+
function materialize!(L::MatLmulMat{<:HessenbergQLayout})
132+
Q,X = L.A,L.B
126133
for j in axes(X,2)
127-
lmul!(Q, view(X,:,j))
134+
ArrayLayouts.lmul!(Q, view(X,:,j))
128135
end
129136
X
130137
end

src/banded/infbanded.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,5 +374,5 @@ mulapplystyle(::BandedColumns{FillLayout}, ::PertToeplitzLayout) = LazyArrayAppl
374374
mulapplystyle(::PertToeplitzLayout, ::BandedColumns{FillLayout}) = LazyArrayApplyStyle()
375375
mulapplystyle(::BandedColumns{FillLayout}, ::BandedToeplitzLayout) = LazyArrayApplyStyle()
376376
mulapplystyle(::BandedToeplitzLayout, ::BandedColumns{FillLayout}) = LazyArrayApplyStyle()
377-
mulapplystyle(::QLayout, ::BandedToeplitzLayout) = LazyArrayApplyStyle()
378-
mulapplystyle(::QLayout, ::PertToeplitzLayout) = LazyArrayApplyStyle()
377+
mulapplystyle(::AbstractQLayout, ::BandedToeplitzLayout) = LazyArrayApplyStyle()
378+
mulapplystyle(::AbstractQLayout, ::PertToeplitzLayout) = LazyArrayApplyStyle()

src/blockbanded/blockbanded.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ blocklayout(::LazyLayout) = BlockLayout{LazyLayout}()
1616
# for LazyLay in (:(BlockLayout{LazyLayout}), :(TriangularLayout{UPLO,UNIT,BlockLayout{LazyLayout}} where {UPLO,UNIT}))
1717
# @eval begin
1818
# combine_mul_styles(::$LazyLay) = LazyArrayApplyStyle()
19-
# mulapplystyle(::QLayout, ::$LazyLay) = LazyArrayApplyStyle()
19+
# mulapplystyle(::AbstractQLayout, ::$LazyLay) = LazyArrayApplyStyle()
2020
# end
2121
# end
2222

src/infql.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ function ql_hessenberg!(B::InfBandedMatrix{TT}; kwds...) where TT
9797
end
9898

9999
getindex(Q::QLPackedQ{T,<:InfBandedMatrix{T}}, i::Integer, j::Integer) where T =
100-
(Q'*Vcat(Zeros{T}(i-1), one(T), Zeros{T}(∞)))[j]'
100+
(Q'*[Zeros{T}(i-1); one(T); Zeros{T}(∞)])[j]'
101101

102-
getL(Q::QL, ::Tuple{OneToInf{Int},OneToInf{Int}}) where T = LowerTriangular(Q.factors)
103-
getL(Q::QLHessenberg, ::Tuple{OneToInf{Int},OneToInf{Int}}) where T = LowerTriangular(Q.factors)
102+
getL(Q::QL, ::NTuple{2,Infinity}) where T = LowerTriangular(Q.factors)
103+
getL(Q::QLHessenberg, ::NTuple{2,Infinity}) where T = LowerTriangular(Q.factors)
104104

105105
# number of structural non-zeros in axis k
106106
nzzeros(A::AbstractArray, k) = size(A,k)
@@ -112,7 +112,8 @@ function nzzeros(B::AbstractMatrix, k)
112112
k == 1 ? size(B,2) + l : size(B,1) + u
113113
end
114114

115-
function lmul!(A::QLPackedQ{<:Any,<:InfBandedMatrix}, B::AbstractVecOrMat)
115+
function materialize!(M::Lmul{<:QLPackedQLayout{<:BandedColumns},<:PaddedLayout})
116+
A,B = M.A,M.B
116117
require_one_based_indexing(B)
117118
mA, nA = size(A.factors)
118119
mB, nB = size(B,1), size(B,2)
@@ -145,7 +146,8 @@ function lmul!(A::QLPackedQ{<:Any,<:InfBandedMatrix}, B::AbstractVecOrMat)
145146
B
146147
end
147148

148-
function lmul!(adjA::Adjoint{<:Any,<:QLPackedQ{<:Any,<:InfBandedMatrix}}, B::AbstractVecOrMat)
149+
function materialize!(M::Lmul{<:AdjQLPackedQLayout{<:BandedColumns},<:PaddedLayout})
150+
adjA,B = M.A,M.B
149151
require_one_based_indexing(B)
150152
A = adjA.parent
151153
mA, nA = size(A.factors)

0 commit comments

Comments
 (0)