@@ -542,20 +542,24 @@ abstract type AbstractBandedLayout <: MemoryLayout end
542
542
abstract type AbstractTridiagonalLayout <: AbstractBandedLayout end
543
543
544
544
struct 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
548
548
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)
552
556
diagonallayout (_) = DiagonalLayout {UnknownLayout} ()
553
557
554
558
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 } ()
559
563
560
564
561
565
MemoryLayout (D:: Type{Diagonal{T,P}} ) where {T,P} = diagonallayout (MemoryLayout (P))
@@ -586,9 +590,11 @@ transposelayout(ml::SymTridiagonalLayout) = ml
586
590
transposelayout (ml:: TridiagonalLayout ) = ml
587
591
transposelayout (ml:: ConjLayout{DiagonalLayout} ) = ml
588
592
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} ()
592
598
593
599
bidiagonaluplo (:: Union{UpperTriangular,UnitUpperTriangular} ) = ' U'
594
600
bidiagonaluplo (:: Union{LowerTriangular,UnitLowerTriangular} ) = ' L'
@@ -598,20 +604,20 @@ supdiagonaldata(U::Union{UnitUpperTriangular,UpperTriangular}) = supdiagonaldata
598
604
subdiagonaldata (U:: Union{UnitLowerTriangular,LowerTriangular} ) = subdiagonaldata (triangulardata (U))
599
605
600
606
adjointlayout (:: 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} ()
602
608
adjointlayout (:: Type{<:Real} , ml:: BidiagonalLayout ) = ml
603
609
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 } ()
606
612
hermitianlayout (_, B:: BidiagonalLayout ) = HermitianLayout {typeof(B)} ()
607
613
614
+ diagonaldata (D:: Transpose ) = diagonaldata (parent (D))
608
615
subdiagonaldata (D:: Transpose ) = supdiagonaldata (parent (D))
609
616
supdiagonaldata (D:: Transpose ) = subdiagonaldata (parent (D))
610
- diagonaldata (D:: Transpose ) = diagonaldata (parent (D))
611
617
618
+ diagonaldata (D:: Adjoint{<:Real} ) = diagonaldata (parent (D))
612
619
subdiagonaldata (D:: Adjoint{<:Real} ) = supdiagonaldata (parent (D))
613
620
supdiagonaldata (D:: Adjoint{<:Real} ) = subdiagonaldata (parent (D))
614
- diagonaldata (D:: Adjoint{<:Real} ) = diagonaldata (parent (D))
615
621
616
622
diagonaldata (S:: HermOrSym ) = diagonaldata (parent (S))
617
623
subdiagonaldata (S:: HermOrSym ) = symmetricuplo (S) == ' L' ? subdiagonaldata (parent (S)) : supdiagonaldata (parent (S))
@@ -653,10 +659,14 @@ colsupport(::ZerosLayout, A, _) = 1:0
653
659
rowsupport (:: DiagonalLayout , _, k) = isempty (k) ? (1 : 0 ) : minimum (k): maximum (k)
654
660
colsupport (:: DiagonalLayout , _, j) = isempty (j) ? (1 : 0 ) : minimum (j): maximum (j)
655
661
656
- colsupport (:: BidiagonalLayout , A, j) =
662
+ function colsupport (:: BidiagonalLayout , A, j)
663
+ isempty (j) && return 1 : 0
657
664
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
659
668
bidiagonaluplo (A) == ' U' ? (minimum (j): min (size (A,2 ),maximum (j)+ 1 )) : (max (minimum (j)- 1 ,1 ): maximum (j))
669
+ end
660
670
661
671
colsupport (:: AbstractTridiagonalLayout , A, j) = max (minimum (j)- 1 ,1 ): min (size (A,1 ),maximum (j)+ 1 )
662
672
rowsupport (:: AbstractTridiagonalLayout , A, j) = max (minimum (j)- 1 ,1 ): min (size (A,2 ),maximum (j)+ 1 )
0 commit comments