@@ -542,20 +542,24 @@ abstract type AbstractBandedLayout <: MemoryLayout end
542542abstract type AbstractTridiagonalLayout <: AbstractBandedLayout end
543543
544544struct DiagonalLayout{ML} <: AbstractBandedLayout end
545- struct BidiagonalLayout{ML } <: AbstractBandedLayout end
546- struct SymTridiagonalLayout{ML } <: AbstractTridiagonalLayout end
547- struct TridiagonalLayout{ML } <: AbstractTridiagonalLayout end
545+ struct BidiagonalLayout{DV,EV } <: AbstractBandedLayout end
546+ struct SymTridiagonalLayout{DV,EV } <: AbstractTridiagonalLayout end
547+ struct TridiagonalLayout{DL,D,DU } <: AbstractTridiagonalLayout end
548548
549- bidiagonallayout (_) = BidiagonalLayout {UnknownLayout} ()
550- tridiagonallayout (_) = TridiagonalLayout {UnknownLayout} ()
551- symtridiagonallayout (_) = SymTridiagonalLayout {UnknownLayout} ()
549+ bidiagonallayout (dv, ev) = BidiagonalLayout {UnknownLayout,UnknownLayout} ()
550+ tridiagonallayout (dl, d, du) = TridiagonalLayout {UnknownLayout,UnknownLayout,UnknownLayout} ()
551+
552+ symtridiagonallayout (d, ev) = SymTridiagonalLayout {UnknownLayout,UnknownLayout} ()
553+ bidiagonallayout (d) = bidiagonallayout (d, d)
554+ tridiagonallayout (d) = tridiagonallayout (d,d,d)
555+ symtridiagonallayout (d) = symtridiagonallayout (d,d)
552556diagonallayout (_) = DiagonalLayout {UnknownLayout} ()
553557
554558
555- diagonallayout (lay :: Union{AbstractStridedLayout, AbstractFillLayout} ) = DiagonalLayout {typeof(lay) } ()
556- bidiagonallayout (lay :: Union{AbstractStridedLayout, AbstractFillLayout} ) = BidiagonalLayout {typeof(lay) } ()
557- tridiagonallayout (lay :: Union{AbstractStridedLayout, AbstractFillLayout} ) = TridiagonalLayout {typeof(lay) } ()
558- symtridiagonallayout (lay :: Union{AbstractStridedLayout, AbstractFillLayout} ) = SymTridiagonalLayout {typeof(lay) } ()
559+ diagonallayout (:: Lay ) where Lay <: Union{AbstractStridedLayout, AbstractFillLayout} = DiagonalLayout {Lay } ()
560+ bidiagonallayout (:: Lay , :: Lay ) where Lay <: Union{AbstractStridedLayout, AbstractFillLayout} = BidiagonalLayout {Lay,Lay } ()
561+ tridiagonallayout (:: Lay , :: Lay , :: Lay ) where Lay <: Union{AbstractStridedLayout, AbstractFillLayout} = TridiagonalLayout {Lay,Lay,Lay } ()
562+ symtridiagonallayout (:: Lay , :: Lay ) where Lay <: Union{AbstractStridedLayout, AbstractFillLayout} = SymTridiagonalLayout {Lay,Lay } ()
559563
560564
561565MemoryLayout (D:: Type{Diagonal{T,P}} ) where {T,P} = diagonallayout (MemoryLayout (P))
@@ -586,9 +590,11 @@ transposelayout(ml::SymTridiagonalLayout) = ml
586590transposelayout (ml:: TridiagonalLayout ) = ml
587591transposelayout (ml:: ConjLayout{DiagonalLayout} ) = ml
588592
589- triangularlayout (:: Type{<:TriangularLayout{UPLO,'N'}} , :: TridiagonalLayout{ML} ) where {UPLO,ML} = BidiagonalLayout {ML} ()
590- triangularlayout (:: Type{<:TriangularLayout{UPLO,'N'}} , :: TridiagonalLayout{FillLayout} ) where UPLO = BidiagonalLayout {FillLayout} ()
591- triangularlayout (:: Type{<:TriangularLayout{UPLO,'U'}} , :: TridiagonalLayout{FillLayout} ) where UPLO = BidiagonalLayout {FillLayout} ()
593+ triangularlayout (:: Type{<:TriangularLayout{'L','N'}} , :: TridiagonalLayout{DL,D,DU} ) where {DL,D,DU} = BidiagonalLayout {D,DL} ()
594+ triangularlayout (:: Type{<:TriangularLayout{'U','N'}} , :: TridiagonalLayout{DL,D,DU} ) where {UPLO,DL,D,DU} = BidiagonalLayout {D,DU} ()
595+ triangularlayout (:: Type{<:TriangularLayout{'L','N'}} , :: TridiagonalLayout{FillLayout,FillLayout,FillLayout} ) = BidiagonalLayout {FillLayout,FillLayout} ()
596+ triangularlayout (:: Type{<:TriangularLayout{'U','N'}} , :: TridiagonalLayout{FillLayout,FillLayout,FillLayout} ) = BidiagonalLayout {FillLayout,FillLayout} ()
597+ triangularlayout (:: Type{<:TriangularLayout{UPLO,'U'}} , :: TridiagonalLayout{FillLayout,FillLayout,FillLayout} ) where UPLO = BidiagonalLayout {FillLayout,FillLayout} ()
592598
593599bidiagonaluplo (:: Union{UpperTriangular,UnitUpperTriangular} ) = ' U'
594600bidiagonaluplo (:: Union{LowerTriangular,UnitLowerTriangular} ) = ' L'
@@ -598,20 +604,20 @@ supdiagonaldata(U::Union{UnitUpperTriangular,UpperTriangular}) = supdiagonaldata
598604subdiagonaldata (U:: Union{UnitLowerTriangular,LowerTriangular} ) = subdiagonaldata (triangulardata (U))
599605
600606adjointlayout (:: Type{<:Real} , ml:: SymTridiagonalLayout ) = ml
601- adjointlayout (:: Type{<:Real} , ml :: TridiagonalLayout ) = ml
607+ adjointlayout (:: Type{<:Real} , :: TridiagonalLayout{DL,D,DU} ) where {DL,D,DU} = TridiagonalLayout {DU,D,DL} ()
602608adjointlayout (:: Type{<:Real} , ml:: BidiagonalLayout ) = ml
603609
604- symmetriclayout (B:: BidiagonalLayout{ML } ) where ML = SymTridiagonalLayout {ML } ()
605- hermitianlayout (:: Type{<:Real} , B:: BidiagonalLayout{ML } ) where ML = SymTridiagonalLayout {ML } ()
610+ symmetriclayout (B:: BidiagonalLayout{DV,EV } ) where {DV,EV} = SymTridiagonalLayout {DV,EV } ()
611+ hermitianlayout (:: Type{<:Real} , B:: BidiagonalLayout{DV,EV } ) where {DV,EV} = SymTridiagonalLayout {DV,EV } ()
606612hermitianlayout (_, B:: BidiagonalLayout ) = HermitianLayout {typeof(B)} ()
607613
614+ diagonaldata (D:: Transpose ) = diagonaldata (parent (D))
608615subdiagonaldata (D:: Transpose ) = supdiagonaldata (parent (D))
609616supdiagonaldata (D:: Transpose ) = subdiagonaldata (parent (D))
610- diagonaldata (D:: Transpose ) = diagonaldata (parent (D))
611617
618+ diagonaldata (D:: Adjoint{<:Real} ) = diagonaldata (parent (D))
612619subdiagonaldata (D:: Adjoint{<:Real} ) = supdiagonaldata (parent (D))
613620supdiagonaldata (D:: Adjoint{<:Real} ) = subdiagonaldata (parent (D))
614- diagonaldata (D:: Adjoint{<:Real} ) = diagonaldata (parent (D))
615621
616622diagonaldata (S:: HermOrSym ) = diagonaldata (parent (S))
617623subdiagonaldata (S:: HermOrSym ) = symmetricuplo (S) == ' L' ? subdiagonaldata (parent (S)) : supdiagonaldata (parent (S))
@@ -653,10 +659,14 @@ colsupport(::ZerosLayout, A, _) = 1:0
653659rowsupport (:: DiagonalLayout , _, k) = isempty (k) ? (1 : 0 ) : minimum (k): maximum (k)
654660colsupport (:: DiagonalLayout , _, j) = isempty (j) ? (1 : 0 ) : minimum (j): maximum (j)
655661
656- colsupport (:: BidiagonalLayout , A, j) =
662+ function colsupport (:: BidiagonalLayout , A, j)
663+ isempty (j) && return 1 : 0
657664 bidiagonaluplo (A) == ' L' ? (minimum (j): min (size (A,1 ),maximum (j)+ 1 )) : (max (minimum (j)- 1 ,1 ): maximum (j))
658- rowsupport (:: BidiagonalLayout , A, j) =
665+ end
666+ function rowsupport (:: BidiagonalLayout , A, j)
667+ isempty (j) && return 1 : 0
659668 bidiagonaluplo (A) == ' U' ? (minimum (j): min (size (A,2 ),maximum (j)+ 1 )) : (max (minimum (j)- 1 ,1 ): maximum (j))
669+ end
660670
661671colsupport (:: AbstractTridiagonalLayout , A, j) = max (minimum (j)- 1 ,1 ): min (size (A,1 ),maximum (j)+ 1 )
662672rowsupport (:: AbstractTridiagonalLayout , A, j) = max (minimum (j)- 1 ,1 ): min (size (A,2 ),maximum (j)+ 1 )
0 commit comments