{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE GADTs #-}
module Numeric.LAPACK.Matrix.Quadratic (
   asDiagonal,
   asSymmetric,

   size,
   mapSize,

   identity,
   diagonal, Diagonal,
   OmniMatrix.takeDiagonal,

   takeTopLeft,
   takeTopRight,
   takeBottomLeft,
   takeBottomRight,
   ) where

import qualified Numeric.LAPACK.Matrix.Symmetric as Symmetric
import qualified Numeric.LAPACK.Matrix.Triangular as Triangular
import qualified Numeric.LAPACK.Matrix.Mosaic.Private as Mos

import qualified Numeric.LAPACK.Matrix.BandedHermitian.Basic as BandedHermitian
import qualified Numeric.LAPACK.Matrix.Banded.Basic as Banded
import qualified Numeric.LAPACK.Matrix.Square.Basic as Square
import qualified Numeric.LAPACK.Matrix.Basic as Full

import qualified Numeric.LAPACK.Matrix.Type as Matrix
import qualified Numeric.LAPACK.Matrix.Class as MatrixClass
import qualified Numeric.LAPACK.Matrix.Array.Basic as OmniMatrix
import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Shape as MatrixShape
import qualified Numeric.LAPACK.Matrix.Shape.Omni as Omni
import qualified Numeric.LAPACK.Matrix.Layout.Private as Layout
import Numeric.LAPACK.Matrix.Array.Banded (FlexDiagonal)
import Numeric.LAPACK.Matrix.Array.Mosaic (Symmetric)
import Numeric.LAPACK.Matrix.Array (General, Quadratic)
import Numeric.LAPACK.Matrix.Shape.Omni (Arbitrary)
import Numeric.LAPACK.Matrix.Layout.Private (Order)
import Numeric.LAPACK.Vector (Vector)

import qualified Numeric.Netlib.Class as Class

import qualified Data.Array.Comfort.Storable.Unchecked as Array
import qualified Data.Array.Comfort.Shape as Shape
import Data.Array.Comfort.Shape ((::+))
import Data.Function.HT (Id)



asDiagonal :: Id (FlexDiagonal diag sh a)
asDiagonal :: Id (FlexDiagonal diag sh a)
asDiagonal = Id (FlexDiagonal diag sh a)
forall a. a -> a
id

asSymmetric :: Id (Symmetric sh a)
asSymmetric :: Id (Symmetric sh a)
asSymmetric = Id (Symmetric sh a)
forall a. a -> a
id


size :: Quadratic pack property lower upper sh a -> sh
size :: Quadratic pack property lower upper sh a -> sh
size = Omni pack property lower upper Shape Small Small sh sh -> sh
forall pack property lower upper sh.
Omni pack property lower upper Shape Small Small sh sh -> sh
Omni.squareSize (Omni pack property lower upper Shape Small Small sh sh -> sh)
-> (Quadratic pack property lower upper sh a
    -> Omni pack property lower upper Shape Small Small sh sh)
-> Quadratic pack property lower upper sh a
-> sh
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Quadratic pack property lower upper sh a
-> Omni pack property lower upper Shape Small Small sh sh
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
ArrMatrix.shape

{- |
The number of rows and columns must be maintained by the shape mapping function.
-}
mapSize ::
   (Shape.C shA, Shape.C shB) =>
   (shA -> shB) ->
   Quadratic pack property lower upper shA a ->
   Quadratic pack property lower upper shB a
mapSize :: (shA -> shB)
-> Quadratic pack property lower upper shA a
-> Quadratic pack property lower upper shB a
mapSize = (shA -> shB)
-> Quadratic pack property lower upper shA a
-> Quadratic pack property lower upper shB a
forall shA shB pack property lower upper a.
(C shA, C shB) =>
(shA -> shB)
-> Quadratic pack property lower upper shA a
-> Quadratic pack property lower upper shB a
OmniMatrix.mapSquareSize


identity ::
   (Omni.Quadratic pack property lower upper, Shape.C sh, Class.Floating a) =>
   Order -> sh -> Quadratic pack property lower upper sh a
identity :: Order -> sh -> Quadratic pack property lower upper sh a
identity = Order -> sh -> Quadratic pack property lower upper sh a
forall pack property lower upper sh a.
(Quadratic pack property lower upper, C sh, Floating a) =>
Order -> sh -> Quadratic pack property lower upper sh a
OmniMatrix.identityOrder

diagonal ::
   (Diagonal property, Omni.Quadratic pack property lower upper,
    Shape.C sh, Class.Floating a) =>
   Order -> Vector sh a -> Quadratic pack property lower upper sh a
diagonal :: Order -> Vector sh a -> Quadratic pack property lower upper sh a
diagonal Order
order Vector sh a
v = Quadratic pack property lower upper sh
-> Vector sh a -> Quadratic pack property lower upper sh a
forall property pack lower upper sh a.
(Diagonal property, Quadratic pack property lower upper, C sh,
 Floating a) =>
Quadratic pack property lower upper sh
-> Vector sh a -> Quadratic pack property lower upper sh a
diagonalAux (Order -> sh -> Quadratic pack property lower upper sh
forall pack property lower upper sh.
(Quadratic pack property lower upper, C sh) =>
Order
-> sh -> Omni pack property lower upper Shape Small Small sh sh
Omni.quadratic Order
order (sh -> Quadratic pack property lower upper sh)
-> sh -> Quadratic pack property lower upper sh
forall a b. (a -> b) -> a -> b
$ Vector sh a -> sh
forall sh a. Array sh a -> sh
Array.shape Vector sh a
v) Vector sh a
v

class (Omni.Property property) => Diagonal property where
   diagonalAux ::
      (Omni.Quadratic pack property lower upper) =>
      (Shape.C sh, Class.Floating a) =>
      MatrixShape.Quadratic pack property lower upper sh -> Vector sh a ->
      Quadratic pack property lower upper sh a

instance Diagonal Arbitrary where
   diagonalAux :: Quadratic pack Arbitrary lower upper sh
-> Vector sh a -> Quadratic pack Arbitrary lower upper sh a
diagonalAux Quadratic pack Arbitrary lower upper sh
omni Vector sh a
v =
      case Quadratic pack Arbitrary lower upper sh
omni of
         Omni.Full Full Shape Small Small sh sh
_ -> Quadratic pack Arbitrary lower upper sh
-> Vector sh a -> Quadratic Unpacked Arbitrary lower upper sh a
forall property lower upper sh a pack.
(Property property, Strip lower, Strip upper, C sh, Floating a) =>
Quadratic pack property lower upper sh
-> Vector sh a -> Quadratic Unpacked property lower upper sh a
squareDiagonal Quadratic pack Arbitrary lower upper sh
omni Vector sh a
v
         Omni.LowerTriangular LowerTriangular sh
_ -> Order -> Vector sh a -> Triangular lower Arbitrary upper sh a
forall lo up sh a.
(UpLo lo up, C sh, Floating a) =>
Order -> Vector sh a -> Triangular lo Arbitrary up sh a
Triangular.diagonal (Quadratic pack Arbitrary lower upper sh -> Order
forall pack property lower upper meas vert horiz height width.
Omni pack property lower upper meas vert horiz height width
-> Order
Omni.order Quadratic pack Arbitrary lower upper sh
omni) Vector sh a
v
         Omni.UpperTriangular UpperTriangular sh
_ -> Order -> Vector sh a -> Triangular lower Arbitrary upper sh a
forall lo up sh a.
(UpLo lo up, C sh, Floating a) =>
Order -> Vector sh a -> Triangular lo Arbitrary up sh a
Triangular.diagonal (Quadratic pack Arbitrary lower upper sh -> Order
forall pack property lower upper meas vert horiz height width.
Omni pack property lower upper meas vert horiz height width
-> Order
Omni.order Quadratic pack Arbitrary lower upper sh
omni) Vector sh a
v
         Omni.Banded Banded sub super Shape Small Small sh sh
_ ->
            OmniArray
  Packed
  Arbitrary
  (Bands sub)
  (Bands super)
  Shape
  Small
  Small
  sh
  sh
  a
-> Matrix
     (Array Packed Arbitrary)
     ()
     ()
     (Bands sub)
     (Bands super)
     Shape
     Small
     Small
     sh
     sh
     a
forall pack prop lower upper meas vert horiz height width a.
OmniArray pack prop lower upper meas vert horiz height width a
-> Matrix
     (Array pack prop) () () lower upper meas vert horiz height width a
ArrMatrix.Array (OmniArray
   Packed
   Arbitrary
   (Bands sub)
   (Bands super)
   Shape
   Small
   Small
   sh
   sh
   a
 -> Matrix
      (Array Packed Arbitrary)
      ()
      ()
      (Bands sub)
      (Bands super)
      Shape
      Small
      Small
      sh
      sh
      a)
-> OmniArray
     Packed
     Arbitrary
     (Bands sub)
     (Bands super)
     Shape
     Small
     Small
     sh
     sh
     a
-> Matrix
     (Array Packed Arbitrary)
     ()
     ()
     (Bands sub)
     (Bands super)
     Shape
     Small
     Small
     sh
     sh
     a
forall a b. (a -> b) -> a -> b
$ (Banded sub super Shape Small Small sh sh
 -> Omni
      Packed Arbitrary (Bands sub) (Bands super) Shape Small Small sh sh)
-> Array (Banded sub super Shape Small Small sh sh) a
-> OmniArray
     Packed
     Arbitrary
     (Bands sub)
     (Bands super)
     Shape
     Small
     Small
     sh
     sh
     a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape Banded sub super Shape Small Small sh sh
-> Omni
     Packed Arbitrary (Bands sub) (Bands super) Shape Small Small sh sh
forall sub super meas vert horiz height width.
(Natural sub, Natural super) =>
Banded sub super meas vert horiz height width
-> Omni
     Packed
     Arbitrary
     (Bands sub)
     (Bands super)
     meas
     vert
     horiz
     height
     width
Omni.Banded (Array (Banded sub super Shape Small Small sh sh) a
 -> OmniArray
      Packed
      Arbitrary
      (Bands sub)
      (Bands super)
      Shape
      Small
      Small
      sh
      sh
      a)
-> Array (Banded sub super Shape Small Small sh sh) a
-> OmniArray
     Packed
     Arbitrary
     (Bands sub)
     (Bands super)
     Shape
     Small
     Small
     sh
     sh
     a
forall a b. (a -> b) -> a -> b
$
            Order
-> Vector sh a
-> Array (Banded sub super Shape Small Small sh sh) a
forall sub super size a.
(Natural sub, Natural super, C size, Floating a) =>
Order -> Vector size a -> Square sub super size a
Banded.diagonalFat (Quadratic pack Arbitrary lower upper sh -> Order
forall pack property lower upper meas vert horiz height width.
Omni pack property lower upper meas vert horiz height width
-> Order
Omni.order Quadratic pack Arbitrary lower upper sh
omni) Vector sh a
v

instance Diagonal Omni.Symmetric where
   diagonalAux :: Quadratic pack Symmetric lower upper sh
-> Vector sh a -> Quadratic pack Symmetric lower upper sh a
diagonalAux Quadratic pack Symmetric lower upper sh
omni Vector sh a
v =
      case Quadratic pack Symmetric lower upper sh
omni of
         Omni.Full Full Shape Small Small sh sh
_ -> Quadratic pack Symmetric lower upper sh
-> Vector sh a -> Quadratic Unpacked Symmetric lower upper sh a
forall property lower upper sh a pack.
(Property property, Strip lower, Strip upper, C sh, Floating a) =>
Quadratic pack property lower upper sh
-> Vector sh a -> Quadratic Unpacked property lower upper sh a
squareDiagonal Quadratic pack Symmetric lower upper sh
omni Vector sh a
v
         Omni.LowerTriangular LowerTriangular sh
_ -> [Char] -> Quadratic pack Symmetric lower upper sh a
forall a. HasCallStack => [Char] -> a
error [Char]
"lower triangular not symmetric"
         Omni.UpperTriangular UpperTriangular sh
_ -> [Char] -> Quadratic pack Symmetric lower upper sh a
forall a. HasCallStack => [Char] -> a
error [Char]
"upper triangular not symmetric"
         Omni.Symmetric Symmetric sh
_ -> Order -> Vector sh a -> Symmetric sh a
forall sh a.
(C sh, Floating a) =>
Order -> Vector sh a -> Symmetric sh a
Symmetric.diagonal (Quadratic pack Symmetric lower upper sh -> Order
forall pack property lower upper meas vert horiz height width.
Omni pack property lower upper meas vert horiz height width
-> Order
Omni.order Quadratic pack Symmetric lower upper sh
omni) Vector sh a
v

squareDiagonal ::
   (Omni.Property property, Omni.Strip lower, Omni.Strip upper) =>
   (Shape.C sh, Class.Floating a) =>
   MatrixShape.Quadratic pack property lower upper sh -> Vector sh a ->
   Quadratic Layout.Unpacked property lower upper sh a
squareDiagonal :: Quadratic pack property lower upper sh
-> Vector sh a -> Quadratic Unpacked property lower upper sh a
squareDiagonal Quadratic pack property lower upper sh
omni =
   FullArray Shape Small Small sh sh a
-> Quadratic Unpacked property lower upper sh a
forall propertyA lowerA upperA measA vertA horizA heightA widthA a.
(Property propertyA, Strip lowerA, Strip upperA) =>
FullArray measA vertA horizA heightA widthA a
-> UnpackedMatrix
     propertyA lowerA upperA measA vertA horizA heightA widthA a
ArrMatrix.liftUnpacked0 (FullArray Shape Small Small sh sh a
 -> Quadratic Unpacked property lower upper sh a)
-> (Vector sh a -> FullArray Shape Small Small sh sh a)
-> Vector sh a
-> Quadratic Unpacked property lower upper sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Order -> Vector sh a -> FullArray Shape Small Small sh sh a
forall sh a.
(C sh, Floating a) =>
Order -> Vector sh a -> Square sh a
Square.diagonalOrder (Quadratic pack property lower upper sh -> Order
forall pack property lower upper meas vert horiz height width.
Omni pack property lower upper meas vert horiz height width
-> Order
Omni.order Quadratic pack property lower upper sh
omni)


takeTopLeft ::
   (Shape.C sh0, Shape.C sh1, Class.Floating a) =>
   Quadratic pack property lower upper (sh0::+sh1) a ->
   Quadratic pack property lower upper sh0 a
takeTopLeft :: Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh0 a
takeTopLeft Quadratic pack property lower upper (sh0 ::+ sh1) a
a =
   case Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Omni
     pack
     property
     lower
     upper
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
ArrMatrix.shape Quadratic pack property lower upper (sh0 ::+ sh1) a
a of
      Omni.Full Full Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1)
_ ->
         (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
 -> FullArray Shape Small Small sh0 sh0 a)
-> UnpackedMatrix
     property
     lower
     upper
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
     a
-> UnpackedMatrix property lower upper Shape Small Small sh0 sh0 a
forall propertyA lowerA upperA propertyB lowerB upperB measA vertA
       horizA heightA widthA a measB vertB horizB heightB widthB b.
(Property propertyA, Strip lowerA, Strip upperA,
 Property propertyB, Strip lowerB, Strip upperB) =>
(FullArray measA vertA horizA heightA widthA a
 -> FullArray measB vertB horizB heightB widthB b)
-> UnpackedMatrix
     propertyA lowerA upperA measA vertA horizA heightA widthA a
-> UnpackedMatrix
     propertyB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.liftUnpacked1
            (Full Shape Small Small (Unchecked sh0) (Unchecked sh0) a
-> FullArray Shape Small Small sh0 sh0 a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz (Unchecked height) (Unchecked width) a
-> Full meas vert horiz height width a
Full.recheck (Full Shape Small Small (Unchecked sh0) (Unchecked sh0) a
 -> FullArray Shape Small Small sh0 sh0 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Shape Small Small (Unchecked sh0) (Unchecked sh0) a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> FullArray Shape Small Small sh0 sh0 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Full Size Big Big (Unchecked sh0) (Unchecked sh0) a
-> Full Shape Small Small (Unchecked sh0) (Unchecked sh0) a
forall meas vert horiz sh a.
(Measure meas, C vert, C horiz, Eq sh) =>
Full meas vert horiz sh sh a -> Square sh a
Square.fromFull (Full Size Big Big (Unchecked sh0) (Unchecked sh0) a
 -> Full Shape Small Small (Unchecked sh0) (Unchecked sh0) a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (Unchecked sh0) (Unchecked sh0) a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Shape Small Small (Unchecked sh0) (Unchecked sh0) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Full Size Big Big sh0 sh0 a
-> Full Size Big Big (Unchecked sh0) (Unchecked sh0) a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas vert horiz (Unchecked height) (Unchecked width) a
Full.uncheck (Full Size Big Big sh0 sh0 a
 -> Full Size Big Big (Unchecked sh0) (Unchecked sh0) a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big sh0 sh0 a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (Unchecked sh0) (Unchecked sh0) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
             Full Size Big Big (sh0 ::+ sh1) sh0 a
-> Full Size Big Big sh0 sh0 a
forall vert height0 height1 width a.
(C vert, C height0, C height1, C width, Floating a) =>
Full Size vert Big (height0 ::+ height1) width a
-> Full Size vert Big height0 width a
Full.takeTop (Full Size Big Big (sh0 ::+ sh1) sh0 a
 -> Full Size Big Big sh0 sh0 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (sh0 ::+ sh1) sh0 a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big sh0 sh0 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) sh0 a
forall vert height width0 width1 a.
(C vert, C height, C width0, C width1, Floating a) =>
Full Size Big vert height (width0 ::+ width1) a
-> Full Size Big vert height width0 a
Full.takeLeft (Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
 -> Full Size Big Big (sh0 ::+ sh1) sh0 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) sh0 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
forall meas vert horiz sh a.
(Measure meas, C vert, C horiz) =>
Square sh a -> Full meas vert horiz sh sh a
Square.toFull) Quadratic pack property lower upper (sh0 ::+ sh1) a
UnpackedMatrix
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
a
      Omni.LowerTriangular LowerTriangular (sh0 ::+ sh1)
_ -> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh0 a
forall pack lo up diag sh0 sh1 a.
(Packing pack, UpLo lo up, TriDiag diag, C sh0, C sh1,
 Floating a) =>
TriangularP pack lo diag up (sh0 ::+ sh1) a
-> TriangularP pack lo diag up sh0 a
Triangular.takeTopLeft Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.UpperTriangular UpperTriangular (sh0 ::+ sh1)
_ -> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh0 a
forall pack lo up diag sh0 sh1 a.
(Packing pack, UpLo lo up, TriDiag diag, C sh0, C sh1,
 Floating a) =>
TriangularP pack lo diag up (sh0 ::+ sh1) a
-> TriangularP pack lo diag up sh0 a
Triangular.takeTopLeft Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.Symmetric Symmetric (sh0 ::+ sh1)
_ -> SymmetricP pack (sh0 ::+ sh1) a -> SymmetricP pack sh0 a
forall pack sh0 sh1 a.
(Packing pack, C sh0, C sh1, Floating a) =>
SymmetricP pack (sh0 ::+ sh1) a -> SymmetricP pack sh0 a
Symmetric.takeTopLeft Quadratic pack property lower upper (sh0 ::+ sh1) a
SymmetricP pack (sh0 ::+ sh1) a
a
      Omni.Hermitian Hermitian (sh0 ::+ sh1)
_ -> (PlainArray
   pack
   property
   lower
   upper
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      pack property lower upper Shape Small Small sh0 sh0 a)
-> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh0 a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray pack property lower upper Shape Small Small sh0 sh0 a
forall height width a mirror.
(C height, C width, Floating a) =>
MosaicUpper mirror (height ::+ width) a
-> MosaicUpper mirror height a
Mos.takeTopLeft Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.Banded Banded sub super Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1)
_ -> (PlainArray
   pack
   property
   lower
   upper
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      pack property lower upper Shape Small Small sh0 sh0 a)
-> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh0 a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray pack property lower upper Shape Small Small sh0 sh0 a
forall sub super sh0 sh1 a.
(Natural sub, Natural super, C sh0, C sh1, Floating a) =>
Square sub super (sh0 ::+ sh1) a -> Square sub super sh0 a
Banded.takeTopLeftSquare Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.BandedHermitian BandedHermitian offDiag (sh0 ::+ sh1)
_ -> (PlainArray
   pack
   property
   lower
   upper
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      pack property lower upper Shape Small Small sh0 sh0 a)
-> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh0 a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray pack property lower upper Shape Small Small sh0 sh0 a
forall offDiag sh0 sh1 a.
(Natural offDiag, C sh0, C sh1, Floating a) =>
BandedHermitian offDiag (sh0 ::+ sh1) a
-> BandedHermitian offDiag sh0 a
BandedHermitian.takeTopLeft Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.UnitBandedTriangular BandedSquare sub super (sh0 ::+ sh1)
_ -> (PlainArray
   pack
   property
   lower
   upper
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      pack property lower upper Shape Small Small sh0 sh0 a)
-> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh0 a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray pack property lower upper Shape Small Small sh0 sh0 a
forall sub super sh0 sh1 a.
(Natural sub, Natural super, C sh0, C sh1, Floating a) =>
Square sub super (sh0 ::+ sh1) a -> Square sub super sh0 a
Banded.takeTopLeftSquare Quadratic pack property lower upper (sh0 ::+ sh1) a
a

takeBottomLeft ::
   (Shape.C sh0, Shape.C sh1, Class.Floating a) =>
   Quadratic pack property Layout.Filled upper (sh0::+sh1) a ->
   General sh1 sh0 a
takeBottomLeft :: Quadratic pack property Filled upper (sh0 ::+ sh1) a
-> General sh1 sh0 a
takeBottomLeft Quadratic pack property Filled upper (sh0 ::+ sh1) a
a =
   case Quadratic pack property Filled upper (sh0 ::+ sh1) a
-> Omni
     pack
     property
     Filled
     upper
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
ArrMatrix.shape Quadratic pack property Filled upper (sh0 ::+ sh1) a
a of
      Omni.Full Full Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1)
_ ->
         (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
 -> FullArray Size Big Big sh1 sh0 a)
-> UnpackedMatrix
     property
     Filled
     upper
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
     a
-> General sh1 sh0 a
forall propertyA lowerA upperA propertyB lowerB upperB measA vertA
       horizA heightA widthA a measB vertB horizB heightB widthB b.
(Property propertyA, Strip lowerA, Strip upperA,
 Property propertyB, Strip lowerB, Strip upperB) =>
(FullArray measA vertA horizA heightA widthA a
 -> FullArray measB vertB horizB heightB widthB b)
-> UnpackedMatrix
     propertyA lowerA upperA measA vertA horizA heightA widthA a
-> UnpackedMatrix
     propertyB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.liftUnpacked1
            (Full Size Big Big (sh0 ::+ sh1) sh0 a
-> FullArray Size Big Big sh1 sh0 a
forall vert height0 height1 width a.
(C vert, C height0, C height1, C width, Floating a) =>
Full Size vert Big (height0 ::+ height1) width a
-> Full Size vert Big height1 width a
Full.takeBottom (Full Size Big Big (sh0 ::+ sh1) sh0 a
 -> FullArray Size Big Big sh1 sh0 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (sh0 ::+ sh1) sh0 a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> FullArray Size Big Big sh1 sh0 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) sh0 a
forall vert height width0 width1 a.
(C vert, C height, C width0, C width1, Floating a) =>
Full Size Big vert height (width0 ::+ width1) a
-> Full Size Big vert height width0 a
Full.takeLeft (Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
 -> Full Size Big Big (sh0 ::+ sh1) sh0 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) sh0 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
forall meas vert horiz sh a.
(Measure meas, C vert, C horiz) =>
Square sh a -> Full meas vert horiz sh sh a
Square.toFull) Quadratic pack property Filled upper (sh0 ::+ sh1) a
UnpackedMatrix
  property
  Filled
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
a
      Omni.LowerTriangular LowerTriangular (sh0 ::+ sh1)
_ -> FlexLowerP pack property (sh0 ::+ sh1) a -> General sh1 sh0 a
forall pack diag sh0 sh1 a.
(Packing pack, TriDiag diag, C sh0, C sh1, Floating a) =>
FlexLowerP pack diag (sh0 ::+ sh1) a -> General sh1 sh0 a
Triangular.takeBottomLeft Quadratic pack property Filled upper (sh0 ::+ sh1) a
FlexLowerP pack property (sh0 ::+ sh1) a
a
      Omni.Symmetric Symmetric (sh0 ::+ sh1)
_ -> Matrix
  (Array Unpacked Arbitrary)
  ()
  ()
  Filled
  Filled
  Size
  Big
  Big
  sh0
  sh1
  a
-> General sh1 sh0 a
forall typ meas vert horiz width height a xl xu lower upper.
(Transpose typ, Measure meas, C vert, C horiz, C width, C height,
 Floating a) =>
Matrix typ xl xu lower upper meas vert horiz height width a
-> Matrix typ xu xl upper lower meas horiz vert width height a
Matrix.transpose (Matrix
   (Array Unpacked Arbitrary)
   ()
   ()
   Filled
   Filled
   Size
   Big
   Big
   sh0
   sh1
   a
 -> General sh1 sh0 a)
-> Matrix
     (Array Unpacked Arbitrary)
     ()
     ()
     Filled
     Filled
     Size
     Big
     Big
     sh0
     sh1
     a
-> General sh1 sh0 a
forall a b. (a -> b) -> a -> b
$ SymmetricP pack (sh0 ::+ sh1) a
-> Matrix
     (Array Unpacked Arbitrary)
     ()
     ()
     Filled
     Filled
     Size
     Big
     Big
     sh0
     sh1
     a
forall pack sh0 sh1 a.
(Packing pack, C sh0, C sh1, Floating a) =>
SymmetricP pack (sh0 ::+ sh1) a -> General sh0 sh1 a
Symmetric.takeTopRight Quadratic pack property Filled upper (sh0 ::+ sh1) a
SymmetricP pack (sh0 ::+ sh1) a
a
      Omni.Hermitian Hermitian (sh0 ::+ sh1)
_ ->
         Matrix
  (Array Unpacked Arbitrary)
  ()
  ()
  Filled
  Filled
  Size
  Big
  Big
  sh0
  sh1
  a
-> General sh1 sh0 a
forall typ meas vert horiz height width a xl xu lower upper.
(Transpose typ, Complex typ, Measure meas, C vert, C horiz,
 C height, C width, Floating a) =>
Matrix typ xl xu lower upper meas vert horiz height width a
-> Matrix typ xu xl upper lower meas horiz vert width height a
MatrixClass.adjoint (Matrix
   (Array Unpacked Arbitrary)
   ()
   ()
   Filled
   Filled
   Size
   Big
   Big
   sh0
   sh1
   a
 -> General sh1 sh0 a)
-> Matrix
     (Array Unpacked Arbitrary)
     ()
     ()
     Filled
     Filled
     Size
     Big
     Big
     sh0
     sh1
     a
-> General sh1 sh0 a
forall a b. (a -> b) -> a -> b
$ (PlainArray
   pack
   property
   Filled
   upper
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      Unpacked Arbitrary Filled Filled Size Big Big sh0 sh1 a)
-> Quadratic pack property Filled upper (sh0 ::+ sh1) a
-> Matrix
     (Array Unpacked Arbitrary)
     ()
     ()
     Filled
     Filled
     Size
     Big
     Big
     sh0
     sh1
     a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  Filled
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray
     Unpacked Arbitrary Filled Filled Size Big Big sh0 sh1 a
forall height width a mirror.
(C height, C width, Floating a) =>
MosaicUpper mirror (height ::+ width) a -> General height width a
Mos.takeTopRight Quadratic pack property Filled upper (sh0 ::+ sh1) a
a

takeTopRight ::
   (Shape.C sh0, Shape.C sh1, Class.Floating a) =>
   Quadratic pack property lower Layout.Filled (sh0::+sh1) a ->
   General sh0 sh1 a
takeTopRight :: Quadratic pack property lower Filled (sh0 ::+ sh1) a
-> General sh0 sh1 a
takeTopRight Quadratic pack property lower Filled (sh0 ::+ sh1) a
a =
   case Quadratic pack property lower Filled (sh0 ::+ sh1) a
-> Omni
     pack
     property
     lower
     Filled
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
ArrMatrix.shape Quadratic pack property lower Filled (sh0 ::+ sh1) a
a of
      Omni.Full Full Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1)
_ ->
         (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
 -> FullArray Size Big Big sh0 sh1 a)
-> UnpackedMatrix
     property
     lower
     Filled
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
     a
-> General sh0 sh1 a
forall propertyA lowerA upperA propertyB lowerB upperB measA vertA
       horizA heightA widthA a measB vertB horizB heightB widthB b.
(Property propertyA, Strip lowerA, Strip upperA,
 Property propertyB, Strip lowerB, Strip upperB) =>
(FullArray measA vertA horizA heightA widthA a
 -> FullArray measB vertB horizB heightB widthB b)
-> UnpackedMatrix
     propertyA lowerA upperA measA vertA horizA heightA widthA a
-> UnpackedMatrix
     propertyB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.liftUnpacked1
            (Full Size Big Big (sh0 ::+ sh1) sh1 a
-> FullArray Size Big Big sh0 sh1 a
forall vert height0 height1 width a.
(C vert, C height0, C height1, C width, Floating a) =>
Full Size vert Big (height0 ::+ height1) width a
-> Full Size vert Big height0 width a
Full.takeTop (Full Size Big Big (sh0 ::+ sh1) sh1 a
 -> FullArray Size Big Big sh0 sh1 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (sh0 ::+ sh1) sh1 a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> FullArray Size Big Big sh0 sh1 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) sh1 a
forall vert height width0 width1 a.
(C vert, C height, C width0, C width1, Floating a) =>
Full Size Big vert height (width0 ::+ width1) a
-> Full Size Big vert height width1 a
Full.takeRight (Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
 -> Full Size Big Big (sh0 ::+ sh1) sh1 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) sh1 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
forall meas vert horiz sh a.
(Measure meas, C vert, C horiz) =>
Square sh a -> Full meas vert horiz sh sh a
Square.toFull) Quadratic pack property lower Filled (sh0 ::+ sh1) a
UnpackedMatrix
  property
  lower
  Filled
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
a
      Omni.UpperTriangular UpperTriangular (sh0 ::+ sh1)
_ -> FlexUpperP pack property (sh0 ::+ sh1) a -> General sh0 sh1 a
forall pack diag sh0 sh1 a.
(Packing pack, TriDiag diag, C sh0, C sh1, Floating a) =>
FlexUpperP pack diag (sh0 ::+ sh1) a -> General sh0 sh1 a
Triangular.takeTopRight Quadratic pack property lower Filled (sh0 ::+ sh1) a
FlexUpperP pack property (sh0 ::+ sh1) a
a
      Omni.Symmetric Symmetric (sh0 ::+ sh1)
_ -> SymmetricP pack (sh0 ::+ sh1) a -> General sh0 sh1 a
forall pack sh0 sh1 a.
(Packing pack, C sh0, C sh1, Floating a) =>
SymmetricP pack (sh0 ::+ sh1) a -> General sh0 sh1 a
Symmetric.takeTopRight Quadratic pack property lower Filled (sh0 ::+ sh1) a
SymmetricP pack (sh0 ::+ sh1) a
a
      Omni.Hermitian Hermitian (sh0 ::+ sh1)
_ -> (PlainArray
   pack
   property
   lower
   Filled
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      Unpacked Arbitrary Filled Filled Size Big Big sh0 sh1 a)
-> Quadratic pack property lower Filled (sh0 ::+ sh1) a
-> General sh0 sh1 a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  lower
  Filled
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray
     Unpacked Arbitrary Filled Filled Size Big Big sh0 sh1 a
forall height width a mirror.
(C height, C width, Floating a) =>
MosaicUpper mirror (height ::+ width) a -> General height width a
Mos.takeTopRight Quadratic pack property lower Filled (sh0 ::+ sh1) a
a

takeBottomRight ::
   (Shape.C sh0, Shape.C sh1, Class.Floating a) =>
   Quadratic pack property lower upper (sh0::+sh1) a ->
   Quadratic pack property lower upper sh1 a
takeBottomRight :: Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh1 a
takeBottomRight Quadratic pack property lower upper (sh0 ::+ sh1) a
a =
   case Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Omni
     pack
     property
     lower
     upper
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
ArrMatrix.shape Quadratic pack property lower upper (sh0 ::+ sh1) a
a of
      Omni.Full Full Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1)
_ ->
         (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
 -> FullArray Shape Small Small sh1 sh1 a)
-> UnpackedMatrix
     property
     lower
     upper
     Shape
     Small
     Small
     (sh0 ::+ sh1)
     (sh0 ::+ sh1)
     a
-> UnpackedMatrix property lower upper Shape Small Small sh1 sh1 a
forall propertyA lowerA upperA propertyB lowerB upperB measA vertA
       horizA heightA widthA a measB vertB horizB heightB widthB b.
(Property propertyA, Strip lowerA, Strip upperA,
 Property propertyB, Strip lowerB, Strip upperB) =>
(FullArray measA vertA horizA heightA widthA a
 -> FullArray measB vertB horizB heightB widthB b)
-> UnpackedMatrix
     propertyA lowerA upperA measA vertA horizA heightA widthA a
-> UnpackedMatrix
     propertyB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.liftUnpacked1
            (Full Shape Small Small (Unchecked sh1) (Unchecked sh1) a
-> FullArray Shape Small Small sh1 sh1 a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz (Unchecked height) (Unchecked width) a
-> Full meas vert horiz height width a
Full.recheck (Full Shape Small Small (Unchecked sh1) (Unchecked sh1) a
 -> FullArray Shape Small Small sh1 sh1 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Shape Small Small (Unchecked sh1) (Unchecked sh1) a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> FullArray Shape Small Small sh1 sh1 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Full Size Big Big (Unchecked sh1) (Unchecked sh1) a
-> Full Shape Small Small (Unchecked sh1) (Unchecked sh1) a
forall meas vert horiz sh a.
(Measure meas, C vert, C horiz, Eq sh) =>
Full meas vert horiz sh sh a -> Square sh a
Square.fromFull (Full Size Big Big (Unchecked sh1) (Unchecked sh1) a
 -> Full Shape Small Small (Unchecked sh1) (Unchecked sh1) a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (Unchecked sh1) (Unchecked sh1) a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Shape Small Small (Unchecked sh1) (Unchecked sh1) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Full Size Big Big sh1 sh1 a
-> Full Size Big Big (Unchecked sh1) (Unchecked sh1) a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz) =>
Full meas vert horiz height width a
-> Full meas vert horiz (Unchecked height) (Unchecked width) a
Full.uncheck (Full Size Big Big sh1 sh1 a
 -> Full Size Big Big (Unchecked sh1) (Unchecked sh1) a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big sh1 sh1 a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (Unchecked sh1) (Unchecked sh1) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
             Full Size Big Big (sh0 ::+ sh1) sh1 a
-> Full Size Big Big sh1 sh1 a
forall vert height0 height1 width a.
(C vert, C height0, C height1, C width, Floating a) =>
Full Size vert Big (height0 ::+ height1) width a
-> Full Size vert Big height1 width a
Full.takeBottom (Full Size Big Big (sh0 ::+ sh1) sh1 a
 -> Full Size Big Big sh1 sh1 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (sh0 ::+ sh1) sh1 a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big sh1 sh1 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) sh1 a
forall vert height width0 width1 a.
(C vert, C height, C width0, C width1, Floating a) =>
Full Size Big vert height (width0 ::+ width1) a
-> Full Size Big vert height width1 a
Full.takeRight (Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
 -> Full Size Big Big (sh0 ::+ sh1) sh1 a)
-> (FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
    -> Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a)
-> FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) sh1 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FullArray Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1) a
-> Full Size Big Big (sh0 ::+ sh1) (sh0 ::+ sh1) a
forall meas vert horiz sh a.
(Measure meas, C vert, C horiz) =>
Square sh a -> Full meas vert horiz sh sh a
Square.toFull) Quadratic pack property lower upper (sh0 ::+ sh1) a
UnpackedMatrix
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
a
      Omni.LowerTriangular LowerTriangular (sh0 ::+ sh1)
_ -> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh1 a
forall pack lo up diag sh0 sh1 a.
(Packing pack, UpLo lo up, TriDiag diag, C sh0, C sh1,
 Floating a) =>
TriangularP pack lo diag up (sh0 ::+ sh1) a
-> TriangularP pack lo diag up sh1 a
Triangular.takeBottomRight Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.UpperTriangular UpperTriangular (sh0 ::+ sh1)
_ -> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh1 a
forall pack lo up diag sh0 sh1 a.
(Packing pack, UpLo lo up, TriDiag diag, C sh0, C sh1,
 Floating a) =>
TriangularP pack lo diag up (sh0 ::+ sh1) a
-> TriangularP pack lo diag up sh1 a
Triangular.takeBottomRight Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.Symmetric Symmetric (sh0 ::+ sh1)
_ -> SymmetricP pack (sh0 ::+ sh1) a -> SymmetricP pack sh1 a
forall pack sh0 sh1 a.
(Packing pack, C sh0, C sh1, Floating a) =>
SymmetricP pack (sh0 ::+ sh1) a -> SymmetricP pack sh1 a
Symmetric.takeBottomRight Quadratic pack property lower upper (sh0 ::+ sh1) a
SymmetricP pack (sh0 ::+ sh1) a
a
      Omni.Hermitian Hermitian (sh0 ::+ sh1)
_ -> (PlainArray
   pack
   property
   lower
   upper
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      pack property lower upper Shape Small Small sh1 sh1 a)
-> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh1 a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray pack property lower upper Shape Small Small sh1 sh1 a
forall height width a mirror.
(C height, C width, Floating a) =>
MosaicUpper mirror (height ::+ width) a
-> MosaicUpper mirror width a
Mos.takeBottomRight Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.Banded Banded sub super Shape Small Small (sh0 ::+ sh1) (sh0 ::+ sh1)
_ -> (PlainArray
   pack
   property
   lower
   upper
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      pack property lower upper Shape Small Small sh1 sh1 a)
-> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh1 a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray pack property lower upper Shape Small Small sh1 sh1 a
forall sub super sh0 sh1 a.
(Natural sub, Natural super, C sh0, C sh1, Floating a) =>
Square sub super (sh0 ::+ sh1) a -> Square sub super sh1 a
Banded.takeBottomRightSquare Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.BandedHermitian BandedHermitian offDiag (sh0 ::+ sh1)
_ ->
         (PlainArray
   pack
   property
   lower
   upper
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      pack property lower upper Shape Small Small sh1 sh1 a)
-> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh1 a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray pack property lower upper Shape Small Small sh1 sh1 a
forall offDiag sh0 sh1 a.
(Natural offDiag, C sh0, C sh1, Floating a) =>
BandedHermitian offDiag (sh0 ::+ sh1) a
-> BandedHermitian offDiag sh1 a
BandedHermitian.takeBottomRight Quadratic pack property lower upper (sh0 ::+ sh1) a
a
      Omni.UnitBandedTriangular BandedSquare sub super (sh0 ::+ sh1)
_ ->
         (PlainArray
   pack
   property
   lower
   upper
   Shape
   Small
   Small
   (sh0 ::+ sh1)
   (sh0 ::+ sh1)
   a
 -> PlainArray
      pack property lower upper Shape Small Small sh1 sh1 a)
-> Quadratic pack property lower upper (sh0 ::+ sh1) a
-> Quadratic pack property lower upper sh1 a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 PlainArray
  pack
  property
  lower
  upper
  Shape
  Small
  Small
  (sh0 ::+ sh1)
  (sh0 ::+ sh1)
  a
-> PlainArray pack property lower upper Shape Small Small sh1 sh1 a
forall sub super sh0 sh1 a.
(Natural sub, Natural super, C sh0, C sh1, Floating a) =>
Square sub super (sh0 ::+ sh1) a -> Square sub super sh1 a
Banded.takeBottomRightSquare Quadratic pack property lower upper (sh0 ::+ sh1) a
a