@@ -34,7 +34,7 @@ sub_materialize(_, V::SubArray{<:Any,1,<:AbstractMatrix,Tuple{InfBandCartesianIn
3434 _inf_banded_sub_materialize (MemoryLayout (parent (V)), V)
3535
3636const TriToeplitz{T} = Tridiagonal{T,Fill{T,1 ,Tuple{OneToInf{Int}}}}
37- const ConstRowMatrix{T} = ApplyMatrix{T,typeof (* ),<: Tuple {<: AbstractVector ,<: AbstractFill {<:Any,2 ,Tuple{OneTo{Int},OneToInf{Int}}} }}
37+ const ConstRowMatrix{T} = ApplyMatrix{T,typeof (* ),<: Tuple {<: AbstractVector ,<: AbstractFillMatrix {<:Any,Tuple{OneTo{Int},OneToInf{Int}}} }}
3838const PertConstRowMatrix{T} = Hcat{T,<: Tuple{Array{T},<:ConstRowMatrix{T}} }
3939const InfToeplitz{T} = BandedMatrix{T,<: ConstRowMatrix{T} ,OneToInf{Int}}
4040const PertToeplitz{T} = BandedMatrix{T,<: PertConstRowMatrix{T} ,OneToInf{Int}}
@@ -337,10 +337,26 @@ for Typ in (:ConstRows, :PertConstRows)
337337 end
338338end
339339
340+ """
341+ TridiagonalToeplitzLayout
342+
343+ represents a matrix which is tridiagonal and toeplitz. Must support
344+ `subdiagonalconstant`, `diagonalconstant`, `supdiagonalconstant`.
345+ """
340346struct TridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
341347const BandedToeplitzLayout = BandedColumns{ConstRows}
342348const PertToeplitzLayout = BandedColumns{PertConstRows}
343349const PertTriangularToeplitzLayout{UPLO,UNIT} = TriangularLayout{UPLO,UNIT,BandedColumns{PertConstRows}}
350+ struct BidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
351+ struct PertBidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
352+ struct PertTridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
353+
354+ const InfToeplitzLayouts = Union{TridiagonalToeplitzLayout, BandedToeplitzLayout, BidiagonalToeplitzLayout,
355+ PertToeplitzLayout, PertTriangularToeplitzLayout, PertBidiagonalToeplitzLayout, PertTridiagonalToeplitzLayout}
356+
357+ subdiagonalconstant (A) = getindex_value (subdiagonaldata (A))
358+ diagonalconstant (A) = getindex_value (diagonaldata (A))
359+ supdiagonalconstant (A) = getindex_value (supdiagonaldata (A))
344360
345361
346362_BandedMatrix (:: BandedToeplitzLayout , A:: AbstractMatrix ) =
@@ -428,18 +444,13 @@ _bandedfill_mul(M::MulAdd, ::Tuple{Any,InfAxes}, ::Tuple{InfAxes,InfAxes}) = App
428444_bandedfill_mul (M:: MulAdd , :: Tuple{InfAxes,InfAxes} , :: Tuple{InfAxes,Any} ) = ApplyArray (* , M. A, M. B)
429445_bandedfill_mul (M:: MulAdd , :: Tuple{Any,InfAxes} , :: Tuple{InfAxes,Any} ) = ApplyArray (* , M. A, M. B)
430446
431- mulreduce (M:: Mul{BandedToeplitzLayout, BandedToeplitzLayout} ) = ApplyArray (M)
432- mulreduce (M:: Mul{BandedToeplitzLayout} ) = ApplyArray (M)
433- mulreduce (M:: Mul{BandedToeplitzLayout,<:PaddedLayout} ) = MulAdd (M)
434- mulreduce (M:: Mul{<:Any, BandedToeplitzLayout} ) = ApplyArray (M)
435- mulreduce (M:: Mul{<:BandedColumns{<:AbstractFillLayout}, PertToeplitzLayout} ) = ApplyArray (M)
436- mulreduce (M:: Mul{<:PertToeplitzLayout, <:BandedColumns{<:AbstractFillLayout}} ) = ApplyArray (M)
437- mulreduce (M:: Mul{<:BandedColumns{<:AbstractFillLayout}, BandedToeplitzLayout} ) = ApplyArray (M)
438- mulreduce (M:: Mul{BandedToeplitzLayout, <:BandedColumns{<:AbstractFillLayout}} ) = ApplyArray (M)
439- mulreduce (M:: Mul{<:AbstractQLayout, BandedToeplitzLayout} ) = ApplyArray (M)
440- mulreduce (M:: Mul{<:AbstractQLayout, PertToeplitzLayout} ) = ApplyArray (M)
441- mulreduce (M:: Mul{<:DiagonalLayout, BandedToeplitzLayout} ) = Lmul (M)
442- mulreduce (M:: Mul{BandedToeplitzLayout, <:DiagonalLayout} ) = Rmul (M)
447+ mulreduce (M:: Mul{<:InfToeplitzLayouts, <:InfToeplitzLayouts} ) = ApplyArray (M)
448+ mulreduce (M:: Mul{<:InfToeplitzLayouts} ) = ApplyArray (M)
449+ mulreduce (M:: Mul{<:InfToeplitzLayouts,<:PaddedLayout} ) = MulAdd (M)
450+ mulreduce (M:: Mul{<:Any, <:InfToeplitzLayouts} ) = ApplyArray (M)
451+ mulreduce (M:: Mul{<:AbstractQLayout, <:InfToeplitzLayouts} ) = ApplyArray (M)
452+ mulreduce (M:: Mul{<:DiagonalLayout, <:InfToeplitzLayouts} ) = Lmul (M)
453+ mulreduce (M:: Mul{<:InfToeplitzLayouts, <:DiagonalLayout} ) = Rmul (M)
443454
444455
445456function _bidiag_forwardsub! (M:: Ldiv{<:Any,<:PaddedLayout} )
@@ -491,8 +502,6 @@ for Typ in (:(LinearAlgebra.Tridiagonal{<:Any,<:InfFill}),
491502 end
492503end
493504
494- struct BidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
495-
496505for Typ in (:(LinearAlgebra. Bidiagonal{<: Any ,<: InfFill }),
497506 :(LazyBandedMatrices. Bidiagonal{<: Any ,<: InfFill ,<: InfFill }))
498507 @eval begin
@@ -501,6 +510,9 @@ for Typ in (:(LinearAlgebra.Bidiagonal{<:Any,<:InfFill}),
501510 end
502511end
503512
513+ * (A:: LinearAlgebra.Bidiagonal{<:Any,<:InfFill} , B:: LinearAlgebra.Bidiagonal{<:Any,<:InfFill} ) =
514+ mul (A, B)
515+
504516# fall back for Ldiv
505517triangularlayout (:: Type{<:TriangularLayout{UPLO,'N'}} , :: TridiagonalToeplitzLayout ) where UPLO = BidiagonalToeplitzLayout ()
506518materialize! (L:: MatLdivVec{BidiagonalToeplitzLayout,Lay} ) where Lay = materialize! (Ldiv {BidiagonalLayout{FillLayout,FillLayout},Lay} (L. A, L. B))
@@ -518,3 +530,10 @@ copy(A::Transpose{T,<:BandedMatrix{T,<:Any,OneToInf{Int}}}) where T = transpose(
518530
519531Base. typed_hcat (:: Type{T} , A:: BandedMatrix{<:Any,<:Any,OneToInf{Int}} , B:: AbstractVecOrMat... ) where T = Hcat {T} (A, B... )
520532
533+
534+
535+ # ##
536+ # SymTriPertToeplitz
537+ # ##
538+
539+ MemoryLayout (:: Type{<:SymTriPertToeplitz} ) = PertTridiagonalToeplitzLayout ()
0 commit comments