@@ -4,7 +4,7 @@ using InfiniteArrays.LazyArrays, InfiniteArrays.ArrayLayouts, InfiniteArrays.Fil
44
55import Base: BroadcastStyle, size, getindex, similar, copy, * , + , - , / , \ , materialize!, copyto!, OneTo
66import 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
88import ArrayLayouts: sub_materialize, MemoryLayout, sublayout, mulreduce, triangularlayout, MatLdivVec, subdiagonaldata, diagonaldata, supdiagonaldata
99import LazyArrays: applybroadcaststyle, applylayout, islazy, islazy_layout, simplifiable, AbstractLazyLayout, PaddedColumns, LazyArrayStyle, ApplyLayout, AbstractLazyBandedLayout, ApplyBandedLayout, BroadcastBandedLayout
1010import 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}}}}}}}
6454const 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)
157150
158151for 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,
339288PertConstRowMatrix (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 ()
346291bandedcolumns (:: ConstRows ) = BandedToeplitzLayout ()
347292bandedcolumns (:: PertConstRows ) = PertToeplitzLayout ()
348293sublayout (:: ConstRows , inds... ) = sublayout (ApplyLayout {typeof(*)} (), inds... )
@@ -355,29 +300,17 @@ for Typ in (:ConstRows, :PertConstRows)
355300 end
356301end
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
365304const BandedToeplitzLayout = BandedColumns{ConstRows}
366305const PertToeplitzLayout = BandedColumns{PertConstRows}
367306const 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 )
381314islazy (:: 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
504408copy (A:: Adjoint{T,<:BandedMatrix{T,<:Any,OneToInf{Int}}} ) where T = copy (parent (A))'
505409copy (A:: Transpose{T,<:BandedMatrix{T,<:Any,OneToInf{Int}}} ) where T = transpose (copy (parent (A)))
0 commit comments