Skip to content

Commit cce29d9

Browse files
committed
Merge branch 'master' into dl/blockarrayext
2 parents d9fb5db + 1a4f215 commit cce29d9

File tree

5 files changed

+151
-125
lines changed

5 files changed

+151
-125
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "InfiniteArrays"
22
uuid = "4858937d-0d70-526a-a4dd-2d5cb5dd786c"
3-
version = "0.15.0"
3+
version = "0.15.0-dev"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

ext/InfiniteArraysBandedMatricesExt.jl

Lines changed: 7 additions & 103 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, ConstRowMatrix, PertConstRowMatrix, SymTriPertToeplitz, TriPertToeplitz, ConstRows, PertConstRows
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
@@ -51,17 +51,10 @@ sub_materialize(_, V::SubArray{<:Any,1,<:AbstractMatrix,Tuple{InfBandCartesianIn
5151

5252

5353

54-
55-
const TriToeplitz{T} = Tridiagonal{T,Fill{T,1,Tuple{OneToInf{Int}}}}
56-
const ConstRowMatrix{T} = ApplyMatrix{T,typeof(*),<:Tuple{<:AbstractVector,<:AbstractFillMatrix{<:Any,Tuple{OneTo{Int},OneToInf{Int}}}}}
57-
const PertConstRowMatrix{T} = Hcat{T,<:Tuple{Array{T},<:ConstRowMatrix{T}}}
58-
const InfToeplitz{T} = BandedMatrix{T,<:ConstRowMatrix{T},OneToInf{Int}}
59-
const PertToeplitz{T} = BandedMatrix{T,<:PertConstRowMatrix{T},OneToInf{Int}}
60-
61-
const SymTriPertToeplitz{T} = SymTridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}
62-
const TriPertToeplitz{T} = Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}
63-
const AdjTriPertToeplitz{T} = Adjoint{T,Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}}
6454
const InfBandedMatrix{T,V<:AbstractMatrix{T}} = BandedMatrix{T,V,OneToInf{Int}}
55+
const InfToeplitz{T} = InfBandedMatrix{T,<:ConstRowMatrix{T}}
56+
const PertToeplitz{T} = InfBandedMatrix{T,<:PertConstRowMatrix{T}}
57+
6558

6659
_prepad(p, a) = Vcat(Zeros{eltype(a)}(max(p,0)), a)
6760
_prepad(p, a::Zeros{T,1}) where T = Zeros{T}(length(a)+p)
@@ -157,50 +150,6 @@ end
157150

158151
for op in (:-, :+)
159152
@eval begin
160-
function $op(A::SymTriPertToeplitz{T}, λ::UniformScaling) where T
161-
TV = promote_type(T,eltype(λ))
162-
dv = Vcat(convert.(AbstractVector{TV}, A.dv.args)...)
163-
ev = Vcat(convert.(AbstractVector{TV}, A.ev.args)...)
164-
SymTridiagonal(broadcast($op, dv, Ref.λ)), ev)
165-
end
166-
function $op::UniformScaling, A::SymTriPertToeplitz{V}) where V
167-
TV = promote_type(eltype(λ),V)
168-
SymTridiagonal(convert(AbstractVector{TV}, broadcast($op, Ref.λ), A.dv)),
169-
convert(AbstractVector{TV}, broadcast($op, A.ev)))
170-
end
171-
function $op(A::SymTridiagonal{T,<:AbstractFill}, λ::UniformScaling) where T
172-
TV = promote_type(T,eltype(λ))
173-
SymTridiagonal(convert(AbstractVector{TV}, broadcast($op, A.dv, Ref.λ))),
174-
convert(AbstractVector{TV}, A.ev))
175-
end
176-
177-
function $op(A::TriPertToeplitz{T}, λ::UniformScaling) where T
178-
TV = promote_type(T,eltype(λ))
179-
Tridiagonal(Vcat(convert.(AbstractVector{TV}, A.dl.args)...),
180-
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.d, λ.λ).args)...),
181-
Vcat(convert.(AbstractVector{TV}, A.du.args)...))
182-
end
183-
function $op::UniformScaling, A::TriPertToeplitz{V}) where V
184-
TV = promote_type(eltype(λ),V)
185-
Tridiagonal(Vcat(convert.(AbstractVector{TV}, broadcast($op, A.dl.args))...),
186-
Vcat(convert.(AbstractVector{TV}, broadcast($op, λ.λ, A.d).args)...),
187-
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.du.args))...))
188-
end
189-
function $op(adjA::AdjTriPertToeplitz{T}, λ::UniformScaling) where T
190-
A = parent(adjA)
191-
TV = promote_type(T,eltype(λ))
192-
Tridiagonal(Vcat(convert.(AbstractVector{TV}, A.du.args)...),
193-
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.d, λ.λ).args)...),
194-
Vcat(convert.(AbstractVector{TV}, A.dl.args)...))
195-
end
196-
function $op::UniformScaling, adjA::AdjTriPertToeplitz{V}) where V
197-
A = parent(adjA)
198-
TV = promote_type(eltype(λ),V)
199-
Tridiagonal(Vcat(convert.(AbstractVector{TV}, broadcast($op, A.du.args))...),
200-
Vcat(convert.(AbstractVector{TV}, broadcast($op, λ.λ, A.d).args)...),
201-
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.dl.args))...))
202-
end
203-
204153
function $op::UniformScaling, A::InfToeplitz{V}) where V
205154
l,u = bandwidths(A)
206155
TV = promote_type(eltype(λ),V)
@@ -339,10 +288,6 @@ ConstRowMatrix(A::AbstractMatrix{T}) where T = ApplyMatrix(*, A[:,1], Ones{T}(1,
339288
PertConstRowMatrix(A::AbstractMatrix{T}) where T =
340289
Hcat(_pertdata(A), ApplyMatrix(*, _constrows(A), Ones{T}(1,size(A,2))))
341290

342-
struct ConstRows <: AbstractLazyLayout end
343-
struct PertConstRows <: AbstractLazyLayout end
344-
MemoryLayout(::Type{<:ConstRowMatrix}) = ConstRows()
345-
MemoryLayout(::Type{<:PertConstRowMatrix}) = PertConstRows()
346291
bandedcolumns(::ConstRows) = BandedToeplitzLayout()
347292
bandedcolumns(::PertConstRows) = PertToeplitzLayout()
348293
sublayout(::ConstRows, inds...) = sublayout(ApplyLayout{typeof(*)}(), inds...)
@@ -355,29 +300,17 @@ for Typ in (:ConstRows, :PertConstRows)
355300
end
356301
end
357302

358-
"""
359-
TridiagonalToeplitzLayout
360303

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

372-
const InfToeplitzLayouts = Union{TridiagonalToeplitzLayout, BandedToeplitzLayout, BidiagonalToeplitzLayout,
373-
PertToeplitzLayout, PertTriangularToeplitzLayout, PertBidiagonalToeplitzLayout, PertTridiagonalToeplitzLayout}
308+
const InfBandedToeplitzLayouts = Union{BandedToeplitzLayout, PertToeplitzLayout, PertTriangularToeplitzLayout}
309+
const InfToeplitzLayouts = Union{InfBaseToeplitzLayouts, InfBandedToeplitzLayouts}
374310

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

379312

380-
islazy_layout(::InfToeplitzLayouts) = Val(true)
313+
islazy_layout(::InfBandedToeplitzLayouts) = Val(true)
381314
islazy(::BandedMatrix{<:Any,<:Any,OneToInf{Int}}) = Val(true)
382315

383316

@@ -399,8 +332,6 @@ _BandedMatrix(::PertToeplitzLayout, A::AbstractMatrix) =
399332
# end
400333

401334

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

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

474405

475406

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-
503407
# copy for AdjOrTrans
504408
copy(A::Adjoint{T,<:BandedMatrix{T,<:Any,OneToInf{Int}}}) where T = copy(parent(A))'
505409
copy(A::Transpose{T,<:BandedMatrix{T,<:Any,OneToInf{Int}}}) where T = transpose(copy(parent(A)))

src/InfiniteArrays.jl

Lines changed: 9 additions & 8 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,18 @@ 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, materialize!, sublayout, MatLdivVec,
32+
subdiagonaldata, diagonaldata, supdiagonaldata, triangularlayout
3533

3634
import Base.Broadcast: BroadcastStyle, Broadcasted, DefaultArrayStyle, axistype, broadcasted
3735

38-
import FillArrays: AbstractFill, Eye, Fill, Ones, RectDiagonal, Zeros, fill_reshape, getindex_value
36+
import FillArrays: AbstractFill, Eye, Fill, Ones, RectDiagonal, Zeros, fill_reshape, getindex_value, AbstractFillMatrix
3937

4038
import Infinities: InfiniteCardinal, Infinity, ∞
4139

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

4544
import LinearAlgebra: AdjOrTrans, HermOrSym, diag, norm, norm1, norm2, normp
4645

@@ -221,5 +220,7 @@ function ArrayLayouts._power_by_squaring(_, ::NTuple{2,InfiniteCardinal{0}}, A::
221220
end
222221
end
223222

223+
include("inftoeplitz.jl")
224+
224225

225226
end # module

src/inftoeplitz.jl

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
const ConstRowMatrix{T} = ApplyMatrix{T,typeof(*),<:Tuple{<:AbstractVector,<:AbstractFillMatrix{<:Any,Tuple{OneTo{Int},OneToInf{Int}}}}}
2+
const PertConstRowMatrix{T} = Hcat{T,<:Tuple{Array{T},<:ConstRowMatrix{T}}}
3+
4+
struct ConstRows <: AbstractLazyLayout end
5+
struct PertConstRows <: AbstractLazyLayout end
6+
MemoryLayout(::Type{<:ConstRowMatrix}) = ConstRows()
7+
MemoryLayout(::Type{<:PertConstRowMatrix}) = PertConstRows()
8+
9+
10+
const TriToeplitz{T} = Tridiagonal{T,Fill{T,1,Tuple{OneToInf{Int}}}}
11+
12+
const SymTriPertToeplitz{T} = SymTridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}
13+
const TriPertToeplitz{T} = Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}
14+
const AdjTriPertToeplitz{T} = Adjoint{T,Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}}
15+
16+
17+
"""
18+
TridiagonalToeplitzLayout
19+
20+
represents a matrix which is tridiagonal and toeplitz. Must support
21+
`subdiagonalconstant`, `diagonalconstant`, `supdiagonalconstant`.
22+
"""
23+
struct TridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
24+
25+
struct BidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
26+
struct PertBidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
27+
struct PertTridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
28+
29+
const InfBaseToeplitzLayouts = Union{TridiagonalToeplitzLayout, BidiagonalToeplitzLayout, PertBidiagonalToeplitzLayout, PertTridiagonalToeplitzLayout}
30+
31+
32+
subdiagonalconstant(A) = getindex_value(subdiagonaldata(A))
33+
diagonalconstant(A) = getindex_value(diagonaldata(A))
34+
supdiagonalconstant(A) = getindex_value(supdiagonaldata(A))
35+
36+
islazy_layout(::InfBaseToeplitzLayouts) = Val(true)
37+
38+
@inline sub_materialize(::ApplyBandedLayout{typeof(*)}, V, ::Tuple{InfAxes,InfAxes}) = V
39+
@inline sub_materialize(::BroadcastBandedLayout, V, ::Tuple{InfAxes,InfAxes}) = V
40+
41+
42+
###
43+
# Inf-Toeplitz layout
44+
# this could possibly be avoided via an InfFillLayout
45+
###
46+
47+
const InfFill = AbstractFill{<:Any,1,<:Tuple{OneToInf}}
48+
49+
for Typ in (:(Tridiagonal{<:Any,<:InfFill}),
50+
:(SymTridiagonal{<:Any,<:InfFill}))
51+
@eval begin
52+
MemoryLayout(::Type{<:$Typ}) = TridiagonalToeplitzLayout()
53+
BroadcastStyle(::Type{<:$Typ}) = LazyArrayStyle{2}()
54+
end
55+
end
56+
57+
MemoryLayout(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = BidiagonalToeplitzLayout()
58+
BroadcastStyle(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = LazyArrayStyle{2}()
59+
60+
*(A::Bidiagonal{<:Any,<:InfFill}, B::Bidiagonal{<:Any,<:InfFill}) =
61+
mul(A, B)
62+
63+
# fall back for Ldiv
64+
triangularlayout(::Type{<:TriangularLayout{UPLO,'N'}}, ::TridiagonalToeplitzLayout) where UPLO = BidiagonalToeplitzLayout()
65+
materialize!(L::MatLdivVec{BidiagonalToeplitzLayout,Lay}) where Lay = materialize!(Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))
66+
copyto!(dest::AbstractArray, L::Ldiv{BidiagonalToeplitzLayout,Lay}) where Lay = copyto!(dest, Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))
67+
68+
69+
70+
for op in (:-, :+)
71+
@eval begin
72+
function $op(A::SymTriPertToeplitz{T}, λ::UniformScaling) where T
73+
TV = promote_type(T,eltype(λ))
74+
dv = Vcat(convert.(AbstractVector{TV}, A.dv.args)...)
75+
ev = Vcat(convert.(AbstractVector{TV}, A.ev.args)...)
76+
SymTridiagonal(broadcast($op, dv, Ref.λ)), ev)
77+
end
78+
function $op::UniformScaling, A::SymTriPertToeplitz{V}) where V
79+
TV = promote_type(eltype(λ),V)
80+
SymTridiagonal(convert(AbstractVector{TV}, broadcast($op, Ref.λ), A.dv)),
81+
convert(AbstractVector{TV}, broadcast($op, A.ev)))
82+
end
83+
function $op(A::SymTridiagonal{T,<:AbstractFill}, λ::UniformScaling) where T
84+
TV = promote_type(T,eltype(λ))
85+
SymTridiagonal(convert(AbstractVector{TV}, broadcast($op, A.dv, Ref.λ))),
86+
convert(AbstractVector{TV}, A.ev))
87+
end
88+
89+
function $op(A::TriPertToeplitz{T}, λ::UniformScaling) where T
90+
TV = promote_type(T,eltype(λ))
91+
Tridiagonal(Vcat(convert.(AbstractVector{TV}, A.dl.args)...),
92+
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.d, λ.λ).args)...),
93+
Vcat(convert.(AbstractVector{TV}, A.du.args)...))
94+
end
95+
function $op::UniformScaling, A::TriPertToeplitz{V}) where V
96+
TV = promote_type(eltype(λ),V)
97+
Tridiagonal(Vcat(convert.(AbstractVector{TV}, broadcast($op, A.dl.args))...),
98+
Vcat(convert.(AbstractVector{TV}, broadcast($op, λ.λ, A.d).args)...),
99+
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.du.args))...))
100+
end
101+
function $op(adjA::AdjTriPertToeplitz{T}, λ::UniformScaling) where T
102+
A = parent(adjA)
103+
TV = promote_type(T,eltype(λ))
104+
Tridiagonal(Vcat(convert.(AbstractVector{TV}, A.du.args)...),
105+
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.d, λ.λ).args)...),
106+
Vcat(convert.(AbstractVector{TV}, A.dl.args)...))
107+
end
108+
function $op::UniformScaling, adjA::AdjTriPertToeplitz{V}) where V
109+
A = parent(adjA)
110+
TV = promote_type(eltype(λ),V)
111+
Tridiagonal(Vcat(convert.(AbstractVector{TV}, broadcast($op, A.du.args))...),
112+
Vcat(convert.(AbstractVector{TV}, broadcast($op, λ.λ, A.d).args)...),
113+
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.dl.args))...))
114+
end
115+
end
116+
end

0 commit comments

Comments
 (0)