Skip to content

Commit fa605c3

Browse files
committed
Move Tridiagonal Toeplitz code out of extension
1 parent 210d087 commit fa605c3

File tree

3 files changed

+62
-52
lines changed

3 files changed

+62
-52
lines changed

ext/InfiniteArraysBandedMatricesExt.jl

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ using InfiniteArrays.LazyArrays, InfiniteArrays.ArrayLayouts, InfiniteArrays.Fil
44

55
import Base: BroadcastStyle, size, getindex, similar, copy, *, +, -, /, \, materialize!, copyto!, OneTo
66
import Base.Broadcast: Broadcasted
7-
import InfiniteArrays: InfIndexRanges, Infinity, PosInfinity, OneToInf, InfAxes, AbstractInfUnitRange, InfRanges
7+
import InfiniteArrays: InfIndexRanges, Infinity, PosInfinity, OneToInf, InfAxes, AbstractInfUnitRange, InfRanges, InfBaseToeplitzLayouts
88
import ArrayLayouts: sub_materialize, MemoryLayout, sublayout, mulreduce, triangularlayout, MatLdivVec, subdiagonaldata, diagonaldata, supdiagonaldata
99
import LazyArrays: applybroadcaststyle, applylayout, islazy, islazy_layout, simplifiable, AbstractLazyLayout, PaddedColumns, LazyArrayStyle, ApplyLayout, AbstractLazyBandedLayout, ApplyBandedLayout, BroadcastBandedLayout
1010
import BandedMatrices: _BandedMatrix, AbstractBandedMatrix, banded_similar, BandedMatrix, bandedcolumns, BandedColumns, bandeddata
@@ -355,29 +355,17 @@ for Typ in (:ConstRows, :PertConstRows)
355355
end
356356
end
357357

358-
"""
359-
TridiagonalToeplitzLayout
360358

361-
represents a matrix which is tridiagonal and toeplitz. Must support
362-
`subdiagonalconstant`, `diagonalconstant`, `supdiagonalconstant`.
363-
"""
364-
struct TridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
365359
const BandedToeplitzLayout = BandedColumns{ConstRows}
366360
const PertToeplitzLayout = BandedColumns{PertConstRows}
367361
const PertTriangularToeplitzLayout{UPLO,UNIT} = TriangularLayout{UPLO,UNIT,BandedColumns{PertConstRows}}
368-
struct BidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
369-
struct PertBidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
370-
struct PertTridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
371362

372-
const InfToeplitzLayouts = Union{TridiagonalToeplitzLayout, BandedToeplitzLayout, BidiagonalToeplitzLayout,
373-
PertToeplitzLayout, PertTriangularToeplitzLayout, PertBidiagonalToeplitzLayout, PertTridiagonalToeplitzLayout}
363+
const InfBandedToeplitzLayouts = Union{BandedToeplitzLayout, PertToeplitzLayout, PertTriangularToeplitzLayout}
364+
const InfToeplitzLayouts = Union{InfBaseToeplitzLayouts, InfBandedToeplitzLayouts}
374365

375-
subdiagonalconstant(A) = getindex_value(subdiagonaldata(A))
376-
diagonalconstant(A) = getindex_value(diagonaldata(A))
377-
supdiagonalconstant(A) = getindex_value(supdiagonaldata(A))
378366

379367

380-
islazy_layout(::InfToeplitzLayouts) = Val(true)
368+
islazy_layout(::InfBandedToeplitzLayouts) = Val(true)
381369
islazy(::BandedMatrix{<:Any,<:Any,OneToInf{Int}}) = Val(true)
382370

383371

@@ -399,8 +387,6 @@ _BandedMatrix(::PertToeplitzLayout, A::AbstractMatrix) =
399387
# end
400388

401389

402-
@inline sub_materialize(::ApplyBandedLayout{typeof(*)}, V, ::Tuple{InfAxes,InfAxes}) = V
403-
@inline sub_materialize(::BroadcastBandedLayout, V, ::Tuple{InfAxes,InfAxes}) = V
404390
@inline sub_materialize(::BandedColumns, V, ::Tuple{InfAxes,InfAxes}) = BandedMatrix(V)
405391
@inline sub_materialize(::BandedColumns, V, ::Tuple{InfAxes,OneTo{Int}}) = BandedMatrix(V)
406392

@@ -473,33 +459,6 @@ mulreduce(M::Mul{<:InfToeplitzLayouts, <:DiagonalLayout}) = Rmul(M)
473459

474460

475461

476-
###
477-
# Inf-Toeplitz layout
478-
# this could possibly be avoided via an InfFillLayout
479-
###
480-
481-
const InfFill = AbstractFill{<:Any,1,<:Tuple{OneToInf}}
482-
483-
for Typ in (:(Tridiagonal{<:Any,<:InfFill}),
484-
:(SymTridiagonal{<:Any,<:InfFill}))
485-
@eval begin
486-
MemoryLayout(::Type{<:$Typ}) = TridiagonalToeplitzLayout()
487-
BroadcastStyle(::Type{<:$Typ}) = LazyArrayStyle{2}()
488-
end
489-
end
490-
491-
MemoryLayout(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = BidiagonalToeplitzLayout()
492-
BroadcastStyle(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = LazyArrayStyle{2}()
493-
494-
*(A::Bidiagonal{<:Any,<:InfFill}, B::Bidiagonal{<:Any,<:InfFill}) =
495-
mul(A, B)
496-
497-
# fall back for Ldiv
498-
triangularlayout(::Type{<:TriangularLayout{UPLO,'N'}}, ::TridiagonalToeplitzLayout) where UPLO = BidiagonalToeplitzLayout()
499-
materialize!(L::MatLdivVec{BidiagonalToeplitzLayout,Lay}) where Lay = materialize!(Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))
500-
copyto!(dest::AbstractArray, L::Ldiv{BidiagonalToeplitzLayout,Lay}) where Lay = copyto!(dest, Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))
501-
502-
503462
# copy for AdjOrTrans
504463
copy(A::Adjoint{T,<:BandedMatrix{T,<:Any,OneToInf{Int}}}) where T = copy(parent(A))'
505464
copy(A::Transpose{T,<:BandedMatrix{T,<:Any,OneToInf{Int}}}) where T = transpose(copy(parent(A)))

src/InfiniteArrays.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@ import Base: *, +, -, /, <, ==, >, \, ≤, ≥, (:), @propagate_inbounds,
1414
searchsortedfirst, searchsortedlast, setindex!, show, show_circular, show_delim_array, sign,
1515
signbit, similar, size, sort, sort!, step, sum, tail,
1616
to_shape, transpose, unaliascopy, union, unitrange_last, unsafe_convert, unsafe_indices, unsafe_length,
17-
vcat, zeros
18-
19-
20-
import Base: range_start_step_length
17+
vcat, zeros, copyto!, range_start_step_length
2118

2219
if VERSION v"1.11.0-DEV.21"
2320
using LinearAlgebra: UpperOrLowerTriangular
@@ -31,16 +28,17 @@ end
3128

3229
using Base.Broadcast
3330
import ArrayLayouts: AbstractBandedLayout, LayoutMatrix, LayoutVecOrMat, LayoutVecOrMats, LayoutVector, MemoryLayout,
34-
RangeCumsum, UnknownLayout, reshapedlayout, sub_materialize, sublayout
31+
RangeCumsum, UnknownLayout, reshapedlayout, sub_materialize, sublayout, MatLdivVec
3532

3633
import Base.Broadcast: BroadcastStyle, Broadcasted, DefaultArrayStyle, axistype, broadcasted
3734

3835
import FillArrays: AbstractFill, Eye, Fill, Ones, RectDiagonal, Zeros, fill_reshape, getindex_value
3936

4037
import Infinities: InfiniteCardinal, Infinity, ∞
4138

42-
import LazyArrays: AbstractCachedVector, ApplyLayout, CachedArray, CachedVector, InvColumnLayout,
43-
LazyArrayStyle, LazyLayout, LazyMatrix, PaddedColumns, _padded_sub_materialize, sub_paddeddata
39+
import LazyArrays: AbstractCachedVector, ApplyLayout, CachedArray, CachedVector, InvColumnLayout, AbstractLazyBandedLayout,
40+
LazyArrayStyle, LazyLayout, LazyMatrix, PaddedColumns, _padded_sub_materialize, sub_paddeddata,
41+
ApplyBandedLayout, BroadcastBandedLayout
4442

4543
import LinearAlgebra: AdjOrTrans, HermOrSym, diag, norm, norm1, norm2, normp
4644

@@ -221,5 +219,7 @@ function ArrayLayouts._power_by_squaring(_, ::NTuple{2,InfiniteCardinal{0}}, A::
221219
end
222220
end
223221

222+
include("inftoeplitz.jl")
223+
224224

225225
end # module

src/inftoeplitz.jl

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"""
2+
TridiagonalToeplitzLayout
3+
4+
represents a matrix which is tridiagonal and toeplitz. Must support
5+
`subdiagonalconstant`, `diagonalconstant`, `supdiagonalconstant`.
6+
"""
7+
struct TridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
8+
9+
struct BidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
10+
struct PertBidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
11+
struct PertTridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
12+
13+
const InfBaseToeplitzLayouts = Union{TridiagonalToeplitzLayout, BidiagonalToeplitzLayout, PertBidiagonalToeplitzLayout, PertTridiagonalToeplitzLayout}
14+
15+
16+
subdiagonalconstant(A) = getindex_value(subdiagonaldata(A))
17+
diagonalconstant(A) = getindex_value(diagonaldata(A))
18+
supdiagonalconstant(A) = getindex_value(supdiagonaldata(A))
19+
20+
islazy_layout(::InfBaseToeplitzLayouts) = Val(true)
21+
22+
@inline sub_materialize(::ApplyBandedLayout{typeof(*)}, V, ::Tuple{InfAxes,InfAxes}) = V
23+
@inline sub_materialize(::BroadcastBandedLayout, V, ::Tuple{InfAxes,InfAxes}) = V
24+
25+
26+
###
27+
# Inf-Toeplitz layout
28+
# this could possibly be avoided via an InfFillLayout
29+
###
30+
31+
const InfFill = AbstractFill{<:Any,1,<:Tuple{OneToInf}}
32+
33+
for Typ in (:(Tridiagonal{<:Any,<:InfFill}),
34+
:(SymTridiagonal{<:Any,<:InfFill}))
35+
@eval begin
36+
MemoryLayout(::Type{<:$Typ}) = TridiagonalToeplitzLayout()
37+
BroadcastStyle(::Type{<:$Typ}) = LazyArrayStyle{2}()
38+
end
39+
end
40+
41+
MemoryLayout(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = BidiagonalToeplitzLayout()
42+
BroadcastStyle(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = LazyArrayStyle{2}()
43+
44+
*(A::Bidiagonal{<:Any,<:InfFill}, B::Bidiagonal{<:Any,<:InfFill}) =
45+
mul(A, B)
46+
47+
# fall back for Ldiv
48+
triangularlayout(::Type{<:TriangularLayout{UPLO,'N'}}, ::TridiagonalToeplitzLayout) where UPLO = BidiagonalToeplitzLayout()
49+
materialize!(L::MatLdivVec{BidiagonalToeplitzLayout,Lay}) where Lay = materialize!(Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))
50+
copyto!(dest::AbstractArray, L::Ldiv{BidiagonalToeplitzLayout,Lay}) where Lay = copyto!(dest, Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))
51+

0 commit comments

Comments
 (0)