Skip to content

Commit 4fae208

Browse files
authored
Suport ∞-UL decomposition for BlockToeplitz (#35)
* Suport ∞-UL decomposition for BlockToeplitz * add tests * Support adaptive QR * Use MatrixFactorizations 0.5 * tridiagonal Toeplitz ul * compare with adaptiveqr * Update Project.toml * Drop Julia 1.3 * avoid special lazy BandedMatrix overload * Update Project.toml * ArrayLayouts 0.4 * update for mulreduce * using works * Update runtests.jl * Update runtests.jl * Update Project.toml * tests pass again * Update Project.toml
1 parent a7f7c6d commit 4fae208

File tree

12 files changed

+343
-188
lines changed

12 files changed

+343
-188
lines changed

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ os:
55
- osx
66
- windows
77
julia:
8-
- 1.3
98
- 1.5
109
- nightly
1110
matrix:

Project.toml

Lines changed: 13 additions & 12 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.5"
3+
version = "0.4.0"
44

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

1818
[compat]
19-
ArrayLayouts = "0.3.5"
20-
BandedMatrices = "0.15.13"
21-
BlockArrays = "0.12.8"
22-
BlockBandedMatrices = "0.8.7"
23-
FillArrays = "0.8.11, 0.9"
24-
InfiniteArrays = "0.7.3"
25-
LazyArrays = "0.16.13"
26-
LazyBandedMatrices = "0.2.11"
27-
MatrixFactorizations = "0.4.1, 0.5"
28-
SemiseparableMatrices = "0.1"
29-
julia = "1.3"
19+
ArrayLayouts = "0.4.3"
20+
BandedMatrices = "0.15.17"
21+
BlockArrays = "0.12.12"
22+
BlockBandedMatrices = "0.9"
23+
FillArrays = "0.9.4"
24+
InfiniteArrays = "0.8"
25+
LazyArrays = "0.17.3"
26+
LazyBandedMatrices = "0.3.1"
27+
MatrixFactorizations = "0.5.2"
28+
SemiseparableMatrices = "0.1.2"
29+
julia = "1.5"
30+
3031

3132
[extras]
3233
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

src/InfiniteLinearAlgebra.jl

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,26 @@ using BlockArrays, BlockBandedMatrices, BandedMatrices, LazyArrays, LazyBandedMa
44

55
import Base: +, -, *, /, \, ^, OneTo, getindex, promote_op, _unsafe_getindex, size, axes,
66
AbstractMatrix, AbstractArray, Matrix, Array, Vector, AbstractVector, Slice,
7-
show, getproperty, copy, map, require_one_based_indexing, similar
7+
show, getproperty, copy, map, require_one_based_indexing, similar, inv
88
import Base.Broadcast: BroadcastStyle, Broadcasted, broadcasted
99

10-
import ArrayLayouts: colsupport, rowsupport, triangularlayout, MatLdivVec, triangulardata, TriangularLayout, sublayout, _qr,
11-
MatLmulVec, MatLmulMat, AbstractQLayout, materialize!
10+
import ArrayLayouts: colsupport, rowsupport, triangularlayout, MatLdivVec, triangulardata, TriangularLayout, TridiagonalLayout,
11+
sublayout, _qr, __qr, MatLmulVec, MatLmulMat, AbstractQLayout, materialize!, diagonaldata, subdiagonaldata, supdiagonaldata,
12+
_bidiag_forwardsub!, mulreduce
1213
import BandedMatrices: BandedMatrix, _BandedMatrix, AbstractBandedMatrix, bandeddata, bandwidths, BandedColumns, bandedcolumns,
13-
_default_banded_broadcast
14+
_default_banded_broadcast, banded_similar
1415
import FillArrays: AbstractFill, getindex_value, axes_print_matrix_row
1516
import InfiniteArrays: OneToInf, InfUnitRange, Infinity, InfStepRange, AbstractInfUnitRange, InfAxes
1617
import LinearAlgebra: lmul!, ldiv!, matprod, qr, AbstractTriangular, AbstractQ, adjoint, transpose
1718
import LazyArrays: applybroadcaststyle, CachedArray, CachedMatrix, CachedVector, DenseColumnMajor, FillLayout, ApplyMatrix, check_mul_axes, ApplyStyle, LazyArrayApplyStyle, LazyArrayStyle,
18-
resizedata!, MemoryLayout, mulapplystyle, LmulStyle, RmulStyle,
19+
resizedata!, MemoryLayout,
1920
factorize, sub_materialize, LazyLayout, LazyArrayStyle, layout_getindex,
20-
@lazymul, applylayout, ApplyLayout, PaddedLayout, zero!, MulAddStyle,
21+
applylayout, ApplyLayout, PaddedLayout, zero!, MulAddStyle,
2122
LazyArray, LazyMatrix, LazyVector, paddeddata
22-
import MatrixFactorizations: ql, ql!, _ql, QLPackedQ, getL, getR, reflector!, reflectorApply!, QL, QR, QRPackedQ,
23+
import MatrixFactorizations: ul, ul!, _ul, ql, ql!, _ql, QLPackedQ, getL, getR, getU, reflector!, reflectorApply!, QL, QR, QRPackedQ,
2324
QRPackedQLayout, AdjQRPackedQLayout, QLPackedQLayout, AdjQLPackedQLayout, LayoutQ
2425

25-
import BlockArrays: AbstractBlockVecOrMat, sizes_from_blocks, _length, BlockedUnitRange, blockcolsupport
26+
import BlockArrays: AbstractBlockVecOrMat, sizes_from_blocks, _length, BlockedUnitRange, blockcolsupport, BlockLayout, AbstractBlockLayout
2627

2728
import BandedMatrices: BandedMatrix, bandwidths, AbstractBandedLayout, _banded_qr!, _banded_qr, _BandedMatrix
2829

@@ -34,9 +35,6 @@ import BlockBandedMatrices: _BlockSkylineMatrix, _BandedMatrix, _BlockSkylineMat
3435

3536
import SemiseparableMatrices: AbstractAlmostBandedLayout, _almostbanded_qr!
3637

37-
LazyArrays.@lazymul BandedMatrix{<:Any,<:Any,<:OneToInf}
38-
*(A::BandedMatrix{<:Any,<:Any,<:OneToInf}, b::CachedVector) = apply(*,A,b)
39-
4038

4139
# BroadcastStyle(::Type{<:BandedMatrix{<:Any,<:Any,<:OneToInf}}) = LazyArrayStyle{2}()
4240

@@ -61,6 +59,7 @@ include("blockbanded/blockbanded.jl")
6159
include("banded/infqltoeplitz.jl")
6260
include("infql.jl")
6361
include("infqr.jl")
62+
include("inful.jl")
6463

6564
#######
6665
# block broadcasted

src/banded/infbanded.jl

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ _prepad(p, a::Zeros{T,1}) where T = Zeros{T}(length(a)+p)
2020
_prepad(p, a::Ones{T,1}) where T = Ones{T}(length(a)+p)
2121
_prepad(p, a::AbstractFill{T,1}) where T = Fill{T}(getindex_value(a), length(a)+p)
2222

23+
banded_similar(T, (m,n)::Tuple{Int,Infinity}, (l,u)::Tuple{Int,Int}) = BandedMatrix{T}(undef, (n,m), (u,l))'
24+
2325
function BandedMatrix{T}(kv::Tuple{Vararg{Pair{<:Integer,<:AbstractVector}}},
2426
::NTuple{2,Infinity},
2527
(l,u)::NTuple{2,Integer}) where T
@@ -306,7 +308,7 @@ for Typ in (:ConstRows, :PertConstRows)
306308
end
307309
end
308310

309-
311+
const TridiagonalToeplitzLayout = Union{SymTridiagonalLayout{FillLayout},TridiagonalLayout{FillLayout}}
310312
const BandedToeplitzLayout = BandedColumns{ConstRows}
311313
const PertToeplitzLayout = BandedColumns{PertConstRows}
312314
const PertTriangularToeplitzLayout{UPLO,UNIT} = TriangularLayout{UPLO,UNIT,BandedColumns{PertConstRows}}
@@ -383,9 +385,42 @@ function _bandedfill_mul(M::MulAdd, ::Tuple{InfAxes,InfAxes}, ::Tuple{InfAxes,In
383385
ret
384386
end
385387

386-
mulapplystyle(::BandedColumns{FillLayout}, ::PertToeplitzLayout) = LazyArrayApplyStyle()
387-
mulapplystyle(::PertToeplitzLayout, ::BandedColumns{FillLayout}) = LazyArrayApplyStyle()
388-
mulapplystyle(::BandedColumns{FillLayout}, ::BandedToeplitzLayout) = LazyArrayApplyStyle()
389-
mulapplystyle(::BandedToeplitzLayout, ::BandedColumns{FillLayout}) = LazyArrayApplyStyle()
390-
mulapplystyle(::AbstractQLayout, ::BandedToeplitzLayout) = LazyArrayApplyStyle()
391-
mulapplystyle(::AbstractQLayout, ::PertToeplitzLayout) = LazyArrayApplyStyle()
388+
mulreduce(M::Mul{<:BandedColumns{<:AbstractFillLayout}, <:PertToeplitzLayout}) = ApplyArray(M)
389+
mulreduce(M::Mul{<:PertToeplitzLayout, <:BandedColumns{<:AbstractFillLayout}}) = ApplyArray(M)
390+
mulreduce(M::Mul{<:BandedColumns{<:AbstractFillLayout}, <:BandedToeplitzLayout}) = ApplyArray(M)
391+
mulreduce(M::Mul{<:BandedToeplitzLayout, <:BandedColumns{<:AbstractFillLayout}}) = ApplyArray(M)
392+
mulreduce(M::Mul{<:AbstractQLayout, <:BandedToeplitzLayout}) = ApplyArray(M)
393+
mulreduce(M::Mul{<:AbstractQLayout, <:PertToeplitzLayout}) = ApplyArray(M)
394+
395+
396+
function _bidiag_forwardsub!(M::Ldiv{<:Any,<:PaddedLayout})
397+
A, b_in = M.A, M.B
398+
dv = diagonaldata(A)
399+
ev = subdiagonaldata(A)
400+
b = paddeddata(b_in)
401+
N = length(b)
402+
b[1] = bj1 = dv[1]\b[1]
403+
@inbounds for j = 2:N
404+
bj = b[j]
405+
bj -= ev[j - 1] * bj1
406+
dvj = dv[j]
407+
if iszero(dvj)
408+
throw(SingularEbception(j))
409+
end
410+
bj = dvj\bj
411+
b[j] = bj1 = bj
412+
end
413+
414+
@inbounds for j = N+1:length(b_in)
415+
iszero(bj1) && break
416+
bj = -ev[j - 1] * bj1
417+
dvj = dv[j]
418+
if iszero(dvj)
419+
throw(SingularEbception(j))
420+
end
421+
bj = dvj\bj
422+
b_in[j] = bj1 = bj
423+
end
424+
425+
b_in
426+
end

src/blockbanded/blockbanded.jl

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,6 @@
11
sizes_from_blocks(A::AbstractVector, ::Tuple{OneToInf{Int}}) = (map(length,A),)
22

33

4-
5-
MemoryLayout(::Type{<:PseudoBlockArray{<:Any,N,<:Arr}}) where {N,Arr} =
6-
MemoryLayout(Arr)
7-
8-
struct BlockLayout{LAY} <: MemoryLayout end
9-
10-
MemoryLayout(::Type{<:BlockArray{<:Any,N,<:Arr}}) where {N,Arr} =
11-
blocklayout(MemoryLayout(Arr))
12-
13-
blocklayout(_) = BlockLayout{UnknownLayout}()
14-
blocklayout(::LazyLayout) = BlockLayout{LazyLayout}()
15-
164
# for LazyLay in (:(BlockLayout{LazyLayout}), :(TriangularLayout{UPLO,UNIT,BlockLayout{LazyLayout}} where {UPLO,UNIT}))
175
# @eval begin
186
# combine_mul_styles(::$LazyLay) = LazyArrayApplyStyle()

src/blockbanded/infblocktridiagonal.jl

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
11
const BlockTriPertToeplitz{T} = BlockMatrix{T,Tridiagonal{Matrix{T},Vcat{Matrix{T},1,Tuple{Vector{Matrix{T}},Fill{Matrix{T},1,Tuple{OneToInf{Int}}}}}},
22
NTuple{2,BlockedUnitRange{Vcat{Int,1,Tuple{Vector{Int},InfStepRange{Int,Int}}}}}}
33

4+
const BlockTridiagonalToeplitzLayout = BlockLayout{TridiagonalLayout{FillLayout},DenseColumnMajor}
45

56
function BlockTridiagonal(adjA::Adjoint{T,BlockTriPertToeplitz{T}}) where T
67
A = parent(adjA)
7-
BlockTridiagonal(Matrix.(adjoint.(A.blocks.du)),
8-
Matrix.(adjoint.(A.blocks.d)),
8+
BlockTridiagonal(Matrix.(adjoint.(A.blocks.du)),
9+
Matrix.(adjoint.(A.blocks.d)),
910
Matrix.(adjoint.(A.blocks.dl)))
10-
end
11+
end
1112

1213
for op in (:-, :+)
1314
@eval begin
14-
function $op(A::BlockTriPertToeplitz{T}, λ::UniformScaling) where T
15+
function $op(A::BlockTriPertToeplitz{T}, λ::UniformScaling) where T
1516
TV = promote_type(T,eltype(λ))
16-
BlockTridiagonal(Vcat(convert.(AbstractVector{Matrix{TV}}, A.blocks.dl.args)...),
17-
Vcat(convert.(AbstractVector{Matrix{TV}}, broadcast($op, A.blocks.d, Ref(λ)).args)...),
17+
BlockTridiagonal(Vcat(convert.(AbstractVector{Matrix{TV}}, A.blocks.dl.args)...),
18+
Vcat(convert.(AbstractVector{Matrix{TV}}, broadcast($op, A.blocks.d, Ref(λ)).args)...),
1819
Vcat(convert.(AbstractVector{Matrix{TV}}, A.blocks.du.args)...))
1920
end
2021
function $op::UniformScaling, A::BlockTriPertToeplitz{V}) where V
2122
TV = promote_type(eltype(λ),V)
22-
BlockTridiagonal(Vcat(convert.(AbstractVector{Matrix{TV}}, broadcast($op, A.blocks.dl.args))...),
23-
Vcat(convert.(AbstractVector{Matrix{TV}}, broadcast($op, Ref(λ), A.blocks.d).args)...),
23+
BlockTridiagonal(Vcat(convert.(AbstractVector{Matrix{TV}}, broadcast($op, A.blocks.dl.args))...),
24+
Vcat(convert.(AbstractVector{Matrix{TV}}, broadcast($op, Ref(λ), A.blocks.d).args)...),
2425
Vcat(convert.(AbstractVector{Matrix{TV}}, broadcast($op, A.blocks.du.args))...))
2526
end
2627
$op(adjA::Adjoint{T,BlockTriPertToeplitz{T}}, λ::UniformScaling) where T = $op(BlockTridiagonal(adjA), λ)
@@ -31,8 +32,8 @@ end
3132
*(a::AbstractVector, b::AbstractFill{<:Any,2,Tuple{OneTo{Int},OneToInf{Int}}}) = ApplyArray(*,a,b)
3233

3334
sizes_from_blocks(A::Diagonal, ::NTuple{2,OneToInf{Int}}) = size.(A.diag, 1), size.(A.diag,2)
34-
3535
sizes_from_blocks(A::Tridiagonal, ::NTuple{2,OneToInf{Int}}) = size.(A.d, 1), size.(A.d,2)
36+
sizes_from_blocks(A::Bidiagonal, ::NTuple{2,OneToInf{Int}}) = size.(A.dv, 1), size.(A.dv,2)
3637

3738
axes_print_matrix_row(_, io, X, A, i, ::AbstractVector{<:Infinity}, sep) = nothing
3839
axes_print_matrix_row(::NTuple{2,BlockedUnitRange}, io, X, A, i, ::AbstractVector{<:Infinity}, sep) = nothing
@@ -46,7 +47,7 @@ function BlockSkylineSizes(A::BlockTriPertToeplitz, (l,u)::NTuple{2,Int})
4647
for J=1:N
4748
block_starts[max(1,J-u),J] = J == 1 ? 1 :
4849
block_starts[max(1,J-1-u),J-1]+block_sizes[J-1]*block_strides[J-1]
49-
50+
5051
for K=max(1,J-u)+1:J+l
5152
block_starts[K,J] = block_starts[K-1,J]+size(A[Block(K-1,J)],1)
5253
end
@@ -72,15 +73,15 @@ function BlockSkylineSizes(A::BlockTriPertToeplitz, (l,u)::NTuple{2,Int})
7273
end
7374

7475
function BlockBandedMatrix(A::BlockTriPertToeplitz{T}, (l,u)::NTuple{2,Int}) where T
75-
data = T[]
76+
data = T[]
7677
append!(data,vec(A[Block.(1:1+l),Block(1)]))
7778
N = max(length(A.blocks.du.args[1])+1,length(A.blocks.d.args[1]),length(A.blocks.dl.args[1]))
7879
for J=2:N
7980
append!(data, vec(A[Block.(max(1,J-u):J+l),Block(J)]))
8081
end
8182
tl = mortar(Fill(vec(A[Block.(max(1,N+1-u):N+1+l),Block(N+1)]),∞))
82-
83+
8384
B = _BlockSkylineMatrix(Vcat(data,tl), BlockSkylineSizes(A, (l,u)))
84-
end
85+
end
8586

8687
BlockBandedMatrix(A::BlockTriPertToeplitz) = BlockBandedMatrix(A, blockbandwidths(A))

src/infql.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ function (*)(A::Adjoint{T,<:QLPackedQ{T,<:InfBlockBandedMatrix}}, x::AbstractVec
280280
end
281281

282282
ldiv!(F::QLProduct, b::AbstractVector) = ldiv!(F.L, lmul!(F.Q',b))
283+
ldiv!(F::QLProduct, b::LayoutVector) = ldiv!(F.L, lmul!(F.Q',b))
283284

284285
function materialize!(M::MatLdivVec{<:TriangularLayout{'L','N',BandedColumns{PertConstRows}},<:PaddedLayout})
285286
A,b = M.A,M.B

src/infqr.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ function AdaptiveQRData(::AbstractAlmostBandedLayout, A::AbstractMatrix{T}) wher
1919
AdaptiveQRData(CachedArray(data,A,(0,0)), Vector{T}(), 0)
2020
end
2121

22-
function AdaptiveQRData(::AbstractBlockBandedLayout, A::AbstractMatrix{T}) where T
22+
function AdaptiveQRData(::AbstractBlockLayout, A::AbstractMatrix{T}) where T
2323
l,u = blockbandwidths(A)
2424
m,n = axes(A)
2525
data = BlockBandedMatrix{T}(undef,(m[Block.(1:2l+u+1)],n[Block.(1:0)]),(l,l+u)) # pad super
@@ -149,6 +149,7 @@ end
149149

150150
_qr(::AbstractBandedLayout, ::NTuple{2,OneToInf{Int}}, A) = adaptiveqr(A)
151151
_qr(::AbstractAlmostBandedLayout, ::NTuple{2,OneToInf{Int}}, A) = adaptiveqr(A)
152+
__qr(_, ::NTuple{2,Infinity}, A) = adaptiveqr(A)
152153
_qr(::AbstractBlockBandedLayout, ::NTuple{2,Infinity}, A) = adaptiveqr(A)
153154

154155
partialqr!(F::QR, n) = partialqr!(F.factors, n)
@@ -306,7 +307,9 @@ end
306307
ldiv!(dest::AbstractVector, F::QR{<:Any,<:AdaptiveQRFactors}, b::AbstractVector) =
307308
ldiv!(F, copyto!(dest, b))
308309
ldiv!(F::QR{<:Any,<:AdaptiveQRFactors}, b::AbstractVector) = ldiv!(F.R, lmul!(F.Q',b))
310+
ldiv!(F::QR{<:Any,<:AdaptiveQRFactors}, b::LayoutVector) = ldiv!(F.R, lmul!(F.Q',b))
309311
\(F::QR{<:Any,<:AdaptiveQRFactors}, B::AbstractVector) = ldiv!(F.R, F.Q'B)
312+
\(F::QR{<:Any,<:AdaptiveQRFactors}, B::LayoutVector) = ldiv!(F.R, F.Q'B)
310313

311314

312315
factorize(A::BandedMatrix{<:Any,<:Any,<:OneToInf}) = qr(A)

src/inful.jl

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
"""
2+
_ultailL1(C, A, B)
3+
4+
gives L[Block(1,1)] of a block-tridiagonal Toeplitz operator. Based on Delvaux and Dette 2012.
5+
"""
6+
7+
# need to solve [1 -B*inv(L); 0 1] * [C A B; 0 C L] == [C L 0; 0 C L]
8+
# that is
9+
# A - B*inv(L)*C == L
10+
# In the scalar case this is quadratic
11+
# L^2 - A*L + B*C == 0
12+
# so that
13+
# = L = (A ± sqrt(A^2 - 4B*C))/2
14+
# we choose sign(A) to maximise the magnitude as we know inv(T)[1,1] -> 0, hence
15+
# inv(L) -> 0
16+
_ultailL1(c::Number, a::Number, b::Number) = (a + sign(a)*sqrt(a^2-4b*c))/2
17+
18+
# In the matrix case we write inv(L)*C = R (double check) to make it quadratic
19+
# A - B*R == inv(C)inv(R)
20+
# C*A*R - C*B*R^2 == I
21+
# and do eigen decomposition of R to reduce this to a companion matrix problem.
22+
23+
function _ultailL1(C::AbstractMatrix, A::AbstractMatrix, B::AbstractMatrix)
24+
d = size(A,1)
25+
λs = filter!-> abs(λ)  1, eigvals([zeros(2,2) -B; -C -A], [B zeros(2,2); zeros(2,2) -B]))
26+
@assert length(λs) == d
27+
V = Matrix{eltype(λs)}(undef, d, d)
28+
for (j,λ) in enumerate(λs)
29+
V[:,j] = svd(A-λ*B - C/λ).V[:,end] # nullspace(A-λ*B - C/λ)
30+
end
31+
C*(V*Diagonal(inv.(λs))/V)
32+
end
33+
34+
function _ul(::TridiagonalToeplitzLayout, J::AbstractMatrix, ::Val{false}; check::Bool = true)
35+
C = getindex_value(subdiagonaldata(J))
36+
A = getindex_value(diagonaldata(J))
37+
B = getindex_value(supdiagonaldata(J))
38+
L = _ultailL1(C, A, B)
39+
U = B/L
40+
UL(Tridiagonal(Fill(convert(typeof(L),C),∞), Fill(L,∞), Fill(U,∞)), OneToInf(), 0)
41+
end
42+
43+
function _ul(::TridiagonalToeplitzLayout, J::AbstractMatrix, ::Val{true}; check::Bool = true)
44+
C = getindex_value(subdiagonaldata(J))
45+
A = getindex_value(diagonaldata(J))
46+
B = getindex_value(supdiagonaldata(J))
47+
A^2 4B*C || error("Pivotting not implemented")
48+
ul(J, Val(false))
49+
end
50+
51+
function _ul(::BlockTridiagonalToeplitzLayout, J::AbstractMatrix, ::Val{false}; check::Bool = true)
52+
C = getindex_value(subdiagonaldata(blocks(J)))
53+
A = getindex_value(diagonaldata(blocks(J)))
54+
B = getindex_value(supdiagonaldata(blocks(J)))
55+
L = _ultailL1(C, A, B)
56+
U = B/L
57+
UL(mortar(Tridiagonal(Fill(convert(typeof(L),C),∞), Fill(L,∞), Fill(U,∞))), OneToInf(), 0)
58+
end
59+
60+
61+
_inf_getU(::TridiagonalToeplitzLayout, F::UL) = Bidiagonal(Fill(one(eltype(F)),∞),F.factors.du, :U)
62+
_inf_getL(::TridiagonalToeplitzLayout, F::UL) = Bidiagonal(F.factors.d,F.factors.dl, :L)
63+
64+
65+
function _inf_getU(::BlockTridiagonalToeplitzLayout, F::UL)
66+
d = size(F.factors.blocks.du[1],1)
67+
II = convert(eltype(F.factors.blocks.du), I(d))
68+
mortar(Bidiagonal(Fill(II,∞),F.factors.blocks.du, :U))
69+
end
70+
71+
_inf_getL(::BlockTridiagonalToeplitzLayout, F::UL) = mortar(Bidiagonal(F.factors.blocks.d,F.factors.blocks.dl, :L))
72+
73+
74+
getU(F::UL, ::NTuple{2,Infinity}) = _inf_getU(MemoryLayout(F.factors), F)
75+
getL(F::UL, ::NTuple{2,Infinity}) = _inf_getL(MemoryLayout(F.factors), F)

0 commit comments

Comments
 (0)