{-# LANGUAGE GADTs #-}
module Numeric.LAPACK.Matrix.Array.Basic where

import qualified Numeric.LAPACK.Matrix.BandedHermitian.Basic as BandedHermitian
import qualified Numeric.LAPACK.Matrix.Banded.Basic as Banded
import qualified Numeric.LAPACK.Matrix.Triangular.Basic as Triangular
import qualified Numeric.LAPACK.Matrix.Mosaic.Packed as Packed
import qualified Numeric.LAPACK.Matrix.Mosaic.Basic as Mosaic
import qualified Numeric.LAPACK.Matrix.Symmetric.Unified as Symmetric
import qualified Numeric.LAPACK.Matrix.Square.Basic as Square

import qualified Numeric.LAPACK.Matrix.Array.Private 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 qualified Numeric.LAPACK.Matrix.Extent as Extent
import qualified Numeric.LAPACK.Vector as Vector
import qualified Numeric.LAPACK.Scalar as Scalar
import Numeric.LAPACK.Matrix.Array.Private (ArrayMatrix, Quadratic)
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.Storable (Array)


{- |
The number of rows must be maintained by the height mapping function.
-}
mapHeight ::
   (ArrayMatrix pack property lower upper Extent.Size vert horiz ~ matrix,
    Extent.C vert, Extent.C horiz,
    Shape.C heightA, Shape.C heightB, Shape.C width) =>
   (heightA -> heightB) ->
   matrix heightA width a -> matrix heightB width a
mapHeight :: (heightA -> heightB)
-> matrix heightA width a -> matrix heightB width a
mapHeight heightA -> heightB
f =
   OmniArray pack property lower upper Size vert horiz heightB width a
-> Matrix
     (Array pack property)
     ()
     ()
     lower
     upper
     Size
     vert
     horiz
     heightB
     width
     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
   pack property lower upper Size vert horiz heightB width a
 -> Matrix
      (Array pack property)
      ()
      ()
      lower
      upper
      Size
      vert
      horiz
      heightB
      width
      a)
-> (ArrayMatrix
      pack property lower upper Size vert horiz heightA width a
    -> OmniArray
         pack property lower upper Size vert horiz heightB width a)
-> ArrayMatrix
     pack property lower upper Size vert horiz heightA width a
-> Matrix
     (Array pack property)
     ()
     ()
     lower
     upper
     Size
     vert
     horiz
     heightB
     width
     a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Omni pack property lower upper Size vert horiz heightA width
 -> Omni pack property lower upper Size vert horiz heightB width)
-> Array
     (Omni pack property lower upper Size vert horiz heightA width) a
-> OmniArray
     pack property lower upper Size vert horiz heightB width a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape ((heightA -> heightB)
-> Omni pack property lower upper Size vert horiz heightA width
-> Omni pack property lower upper Size vert horiz heightB width
forall heightA heightB vert horiz pack property lower upper width.
(C heightA, C heightB, C vert, C horiz) =>
(heightA -> heightB)
-> Omni pack property lower upper Size vert horiz heightA width
-> Omni pack property lower upper Size vert horiz heightB width
Omni.mapHeight heightA -> heightB
f) (Array
   (Omni pack property lower upper Size vert horiz heightA width) a
 -> OmniArray
      pack property lower upper Size vert horiz heightB width a)
-> (ArrayMatrix
      pack property lower upper Size vert horiz heightA width a
    -> Array
         (Omni pack property lower upper Size vert horiz heightA width) a)
-> ArrayMatrix
     pack property lower upper Size vert horiz heightA width a
-> OmniArray
     pack property lower upper Size vert horiz heightB width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArrayMatrix
  pack property lower upper Size vert horiz heightA width a
-> Array
     (Omni pack property lower upper Size vert horiz heightA width) a
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> OmniArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.unwrap

{- |
The number of columns must be maintained by the width mapping function.
-}
mapWidth ::
   (ArrayMatrix pack property lower upper Extent.Size vert horiz ~ matrix,
    Extent.C vert, Extent.C horiz,
    Shape.C widthA, Shape.C widthB, Shape.C height) =>
   (widthA -> widthB) ->
   matrix height widthA a -> matrix height widthB a
mapWidth :: (widthA -> widthB)
-> matrix height widthA a -> matrix height widthB a
mapWidth widthA -> widthB
f =
   OmniArray pack property lower upper Size vert horiz height widthB a
-> Matrix
     (Array pack property)
     ()
     ()
     lower
     upper
     Size
     vert
     horiz
     height
     widthB
     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
   pack property lower upper Size vert horiz height widthB a
 -> Matrix
      (Array pack property)
      ()
      ()
      lower
      upper
      Size
      vert
      horiz
      height
      widthB
      a)
-> (ArrayMatrix
      pack property lower upper Size vert horiz height widthA a
    -> OmniArray
         pack property lower upper Size vert horiz height widthB a)
-> ArrayMatrix
     pack property lower upper Size vert horiz height widthA a
-> Matrix
     (Array pack property)
     ()
     ()
     lower
     upper
     Size
     vert
     horiz
     height
     widthB
     a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Omni pack property lower upper Size vert horiz height widthA
 -> Omni pack property lower upper Size vert horiz height widthB)
-> Array
     (Omni pack property lower upper Size vert horiz height widthA) a
-> OmniArray
     pack property lower upper Size vert horiz height widthB a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape ((widthA -> widthB)
-> Omni pack property lower upper Size vert horiz height widthA
-> Omni pack property lower upper Size vert horiz height widthB
forall widthA widthB vert horiz pack property lower upper height.
(C widthA, C widthB, C vert, C horiz) =>
(widthA -> widthB)
-> Omni pack property lower upper Size vert horiz height widthA
-> Omni pack property lower upper Size vert horiz height widthB
Omni.mapWidth widthA -> widthB
f) (Array
   (Omni pack property lower upper Size vert horiz height widthA) a
 -> OmniArray
      pack property lower upper Size vert horiz height widthB a)
-> (ArrayMatrix
      pack property lower upper Size vert horiz height widthA a
    -> Array
         (Omni pack property lower upper Size vert horiz height widthA) a)
-> ArrayMatrix
     pack property lower upper Size vert horiz height widthA a
-> OmniArray
     pack property lower upper Size vert horiz height widthB a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArrayMatrix
  pack property lower upper Size vert horiz height widthA a
-> Array
     (Omni pack property lower upper Size vert horiz height widthA) a
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> OmniArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.unwrap

mapSquareSize ::
   (Shape.C shA, Shape.C shB) =>
   (shA -> shB) ->
   Quadratic pack property lower upper shA a ->
   Quadratic pack property lower upper shB a
mapSquareSize :: (shA -> shB)
-> Quadratic pack property lower upper shA a
-> Quadratic pack property lower upper shB a
mapSquareSize shA -> shB
f =
   OmniArray pack property lower upper Shape Small Small shB shB a
-> Quadratic pack property lower upper shB 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 pack property lower upper Shape Small Small shB shB a
 -> Quadratic pack property lower upper shB a)
-> (Quadratic pack property lower upper shA a
    -> OmniArray pack property lower upper Shape Small Small shB shB a)
-> Quadratic pack property lower upper shA a
-> Quadratic pack property lower upper shB a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Omni pack property lower upper Shape Small Small shA shA
 -> Omni pack property lower upper Shape Small Small shB shB)
-> Array
     (Omni pack property lower upper Shape Small Small shA shA) a
-> OmniArray pack property lower upper Shape Small Small shB shB a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape ((shA -> shB)
-> Omni pack property lower upper Shape Small Small shA shA
-> Omni pack property lower upper Shape Small Small shB shB
forall shA shB pack property lower upper.
(C shA, C shB) =>
(shA -> shB)
-> Omni pack property lower upper Shape Small Small shA shA
-> Omni pack property lower upper Shape Small Small shB shB
Omni.mapSquareSize shA -> shB
f) (Array (Omni pack property lower upper Shape Small Small shA shA) a
 -> OmniArray pack property lower upper Shape Small Small shB shB a)
-> (Quadratic pack property lower upper shA a
    -> Array
         (Omni pack property lower upper Shape Small Small shA shA) a)
-> Quadratic pack property lower upper shA a
-> OmniArray pack property lower upper Shape Small Small shB shB a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Quadratic pack property lower upper shA a
-> Array
     (Omni pack property lower upper Shape Small Small shA shA) a
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> OmniArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.unwrap


toFull ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz) =>
   (Shape.C height, Shape.C width, Class.Floating a) =>
   ArrayMatrix pack property lower upper meas vert horiz height width a ->
   ArrMatrix.Full meas vert horiz height width a
toFull :: ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Full meas vert horiz height width a
toFull ArrayMatrix
  pack property lower upper meas vert horiz height width a
a =
   case ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
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 ArrayMatrix
  pack property lower upper meas vert horiz height width a
a of
      Omni.Full Full meas vert horiz height width
_ -> (FullArray meas vert horiz height width a
 -> FullArray meas vert horiz height width a)
-> UnpackedMatrix
     property lower upper meas vert horiz height width a
-> Full meas vert horiz height width 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 FullArray meas vert horiz height width a
-> FullArray meas vert horiz height width a
forall a. a -> a
id ArrayMatrix
  pack property lower upper meas vert horiz height width a
UnpackedMatrix property lower upper meas vert horiz height width a
a
      Omni.UpperTriangular UpperTriangular height
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> Full meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked Arbitrary Filled Filled meas vert horiz height width a
forall uplo sh a.
(UpLo uplo, C sh, Floating a) =>
Triangular uplo sh a -> Square sh a
Triangular.toSquare ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.LowerTriangular LowerTriangular height
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> Full meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked Arbitrary Filled Filled meas vert horiz height width a
forall uplo sh a.
(UpLo uplo, C sh, Floating a) =>
Triangular uplo sh a -> Square sh a
Triangular.toSquare ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.Symmetric Symmetric height
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> Full meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked Arbitrary Filled Filled meas vert horiz height width a
forall mirror sh a.
(Mirror mirror, C sh, Floating a) =>
Mosaic mirror Upper sh a -> Square sh a
Symmetric.toSquare ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.Hermitian Hermitian height
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> Full meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked Arbitrary Filled Filled meas vert horiz height width a
forall mirror sh a.
(Mirror mirror, C sh, Floating a) =>
Mosaic mirror Upper sh a -> Square sh a
Symmetric.toSquare ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.Banded Banded sub super meas vert horiz height width
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> Full meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked Arbitrary Filled Filled meas vert horiz height width a
forall sub super meas vert horiz height width a.
(Natural sub, Natural super, Measure meas, C vert, C horiz,
 C height, C width, Floating a) =>
Banded sub super meas vert horiz height width a
-> Full meas vert horiz height width a
Banded.toFull ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.UnitBandedTriangular BandedSquare sub super height
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> Full meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked Arbitrary Filled Filled meas vert horiz height width a
forall sub super meas vert horiz height width a.
(Natural sub, Natural super, Measure meas, C vert, C horiz,
 C height, C width, Floating a) =>
Banded sub super meas vert horiz height width a
-> Full meas vert horiz height width a
Banded.toFull ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.BandedHermitian BandedHermitian offDiag height
_ ->
         (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> Full meas vert horiz height width 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 (Banded offDiag offDiag Shape Small Small height height a
-> Full Shape Small Small height height a
forall sub super meas vert horiz height width a.
(Natural sub, Natural super, Measure meas, C vert, C horiz,
 C height, C width, Floating a) =>
Banded sub super meas vert horiz height width a
-> Full meas vert horiz height width a
Banded.toFull (Banded offDiag offDiag Shape Small Small height height a
 -> Full Shape Small Small height height a)
-> (BandedHermitian offDiag height a
    -> Banded offDiag offDiag Shape Small Small height height a)
-> BandedHermitian offDiag height a
-> Full Shape Small Small height height a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BandedHermitian offDiag height a
-> Banded offDiag offDiag Shape Small Small height height a
forall offDiag size a.
(Natural offDiag, C size, Floating a) =>
BandedHermitian offDiag size a -> Square offDiag offDiag size a
BandedHermitian.toBanded) ArrayMatrix
  pack property lower upper meas vert horiz height width a
a

unpack ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz) =>
   (Shape.C height, Shape.C width, Class.Floating a) =>
   ArrayMatrix pack property lower upper meas vert horiz height width a ->
   ArrayMatrix Layout.Unpacked
      property lower upper meas vert horiz height width a
unpack :: ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width a
unpack ArrayMatrix
  pack property lower upper meas vert horiz height width a
a =
   case ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> Omni pack property lower upper meas vert horiz height width
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 ArrayMatrix
  pack property lower upper meas vert horiz height width a
a of
      Omni.Full Full meas vert horiz height width
_ -> (FullArray meas vert horiz height width a
 -> FullArray meas vert horiz height width a)
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width 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 FullArray meas vert horiz height width a
-> FullArray meas vert horiz height width a
forall a. a -> a
id ArrayMatrix
  pack property lower upper meas vert horiz height width a
ArrayMatrix
  Unpacked property lower upper meas vert horiz height width a
a
      Omni.UpperTriangular UpperTriangular height
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked property lower upper meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked property lower upper meas vert horiz height width a
forall uplo sh a pack mirror.
(UpLo uplo, C sh, Floating a) =>
Mosaic pack mirror uplo sh a -> Mosaic mirror uplo sh a
Mosaic.unpack ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.LowerTriangular LowerTriangular height
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked property lower upper meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked property lower upper meas vert horiz height width a
forall uplo sh a pack mirror.
(UpLo uplo, C sh, Floating a) =>
Mosaic pack mirror uplo sh a -> Mosaic mirror uplo sh a
Mosaic.unpack ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.Symmetric Symmetric height
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked property lower upper meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked property lower upper meas vert horiz height width a
forall uplo sh a pack mirror.
(UpLo uplo, C sh, Floating a) =>
Mosaic pack mirror uplo sh a -> Mosaic mirror uplo sh a
Mosaic.unpack ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.Hermitian Hermitian height
_ -> (PlainArray
   pack property lower upper meas vert horiz height width a
 -> PlainArray
      Unpacked property lower upper meas vert horiz height width a)
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width 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 meas vert horiz height width a
-> PlainArray
     Unpacked property lower upper meas vert horiz height width a
forall uplo sh a pack mirror.
(UpLo uplo, C sh, Floating a) =>
Mosaic pack mirror uplo sh a -> Mosaic mirror uplo sh a
Mosaic.unpack ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.Banded Banded sub super meas vert horiz height width
_ ->
         FullArray meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width 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 meas vert horiz height width a
 -> ArrayMatrix
      Unpacked property lower upper meas vert horiz height width a)
-> FullArray meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$ Banded sub super meas vert horiz height width a
-> FullArray meas vert horiz height width a
forall sub super meas vert horiz height width a.
(Natural sub, Natural super, Measure meas, C vert, C horiz,
 C height, C width, Floating a) =>
Banded sub super meas vert horiz height width a
-> Full meas vert horiz height width a
Banded.toFull (Banded sub super meas vert horiz height width a
 -> FullArray meas vert horiz height width a)
-> Banded sub super meas vert horiz height width a
-> FullArray meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$ ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.UnitBandedTriangular BandedSquare sub super height
_ ->
         FullArray meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width 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 meas vert horiz height width a
 -> ArrayMatrix
      Unpacked property lower upper meas vert horiz height width a)
-> FullArray meas vert horiz height width a
-> ArrayMatrix
     Unpacked property lower upper meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$ Banded sub super meas vert horiz height width a
-> FullArray meas vert horiz height width a
forall sub super meas vert horiz height width a.
(Natural sub, Natural super, Measure meas, C vert, C horiz,
 C height, C width, Floating a) =>
Banded sub super meas vert horiz height width a
-> Full meas vert horiz height width a
Banded.toFull (Banded sub super meas vert horiz height width a
 -> FullArray meas vert horiz height width a)
-> Banded sub super meas vert horiz height width a
-> FullArray meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$ ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector ArrayMatrix
  pack property lower upper meas vert horiz height width a
a
      Omni.BandedHermitian BandedHermitian offDiag height
_ ->
         FullArray Shape Small Small height height a
-> UnpackedMatrix
     property lower upper Shape Small Small height height 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 height height a
 -> UnpackedMatrix
      property lower upper Shape Small Small height height a)
-> FullArray Shape Small Small height height a
-> UnpackedMatrix
     property lower upper Shape Small Small height height a
forall a b. (a -> b) -> a -> b
$ Banded offDiag offDiag Shape Small Small height height a
-> FullArray Shape Small Small height height a
forall sub super meas vert horiz height width a.
(Natural sub, Natural super, Measure meas, C vert, C horiz,
 C height, C width, Floating a) =>
Banded sub super meas vert horiz height width a
-> Full meas vert horiz height width a
Banded.toFull (Banded offDiag offDiag Shape Small Small height height a
 -> FullArray Shape Small Small height height a)
-> Banded offDiag offDiag Shape Small Small height height a
-> FullArray Shape Small Small height height a
forall a b. (a -> b) -> a -> b
$
         BandedHermitian offDiag height a
-> Banded offDiag offDiag Shape Small Small height height a
forall offDiag size a.
(Natural offDiag, C size, Floating a) =>
BandedHermitian offDiag size a -> Square offDiag offDiag size a
BandedHermitian.toBanded (BandedHermitian offDiag height a
 -> Banded offDiag offDiag Shape Small Small height height a)
-> BandedHermitian offDiag height a
-> Banded offDiag offDiag Shape Small Small height height a
forall a b. (a -> b) -> a -> b
$ ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector ArrayMatrix
  pack property lower upper meas vert horiz height width a
a

takeDiagonal ::
   (Shape.C sh, Class.Floating a) =>
   Quadratic pack property lower upper sh a -> Vector sh a
takeDiagonal :: Quadratic pack property lower upper sh a -> Vector sh a
takeDiagonal Quadratic pack property lower upper sh a
a =
   case 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 Quadratic pack property lower upper sh a
a of
      Omni.Full Full Shape Small Small sh sh
fullShape ->
         Square sh a -> Vector sh a
forall sh a. (C sh, Floating a) => Square sh a -> Vector sh a
Square.takeDiagonal (Square sh a -> Vector sh a) -> Square sh a -> Vector sh a
forall a b. (a -> b) -> a -> b
$ Full Shape Small Small sh sh
-> Array (Omni pack property lower upper Shape Small Small sh sh) a
-> Square sh a
forall sh1 sh0 a. sh1 -> Array sh0 a -> Array sh1 a
Array.reshape Full Shape Small Small sh sh
fullShape (Array (Omni pack property lower upper Shape Small Small sh sh) a
 -> Square sh a)
-> Array (Omni pack property lower upper Shape Small Small sh sh) a
-> Square sh a
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a
-> Array (Omni pack property lower upper Shape Small Small sh sh) a
forall pack property lower upper meas vert horiz height width a.
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> OmniArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.unwrap Quadratic pack property lower upper sh a
a
      Omni.UpperTriangular UpperTriangular sh
_ -> Mosaic Packed NoMirror Upper sh a -> Vector sh a
forall uplo sh a pack mirror.
(UpLo uplo, C sh, Floating a) =>
Mosaic pack mirror uplo sh a -> Vector sh a
Mosaic.takeDiagonal (Mosaic Packed NoMirror Upper sh a -> Vector sh a)
-> Mosaic Packed NoMirror Upper sh a -> Vector sh a
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a
-> PlainArray pack property lower upper Shape Small Small sh sh a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector Quadratic pack property lower upper sh a
a
      Omni.LowerTriangular LowerTriangular sh
_ -> Mosaic Packed NoMirror Lower sh a -> Vector sh a
forall uplo sh a pack mirror.
(UpLo uplo, C sh, Floating a) =>
Mosaic pack mirror uplo sh a -> Vector sh a
Mosaic.takeDiagonal (Mosaic Packed NoMirror Lower sh a -> Vector sh a)
-> Mosaic Packed NoMirror Lower sh a -> Vector sh a
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a
-> PlainArray pack property lower upper Shape Small Small sh sh a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector Quadratic pack property lower upper sh a
a
      Omni.Symmetric Symmetric sh
_ -> Mosaic Packed SimpleMirror Upper sh a -> Vector sh a
forall uplo sh a pack mirror.
(UpLo uplo, C sh, Floating a) =>
Mosaic pack mirror uplo sh a -> Vector sh a
Mosaic.takeDiagonal (Mosaic Packed SimpleMirror Upper sh a -> Vector sh a)
-> Mosaic Packed SimpleMirror Upper sh a -> Vector sh a
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a
-> PlainArray pack property lower upper Shape Small Small sh sh a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector Quadratic pack property lower upper sh a
a
      Omni.Hermitian Hermitian sh
_ -> Mosaic Packed ConjugateMirror Upper sh a -> Vector sh a
forall uplo sh a pack mirror.
(UpLo uplo, C sh, Floating a) =>
Mosaic pack mirror uplo sh a -> Vector sh a
Mosaic.takeDiagonal (Mosaic Packed ConjugateMirror Upper sh a -> Vector sh a)
-> Mosaic Packed ConjugateMirror Upper sh a -> Vector sh a
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a
-> PlainArray pack property lower upper Shape Small Small sh sh a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector Quadratic pack property lower upper sh a
a
      Omni.Banded Banded sub super Shape Small Small sh sh
_ -> Square sub super sh a -> Vector sh a
forall sub super sh a.
(Natural sub, Natural super, C sh, Floating a) =>
Square sub super sh a -> Vector sh a
Banded.takeDiagonal (Square sub super sh a -> Vector sh a)
-> Square sub super sh a -> Vector sh a
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a
-> PlainArray pack property lower upper Shape Small Small sh sh a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector Quadratic pack property lower upper sh a
a
      Omni.UnitBandedTriangular BandedSquare sub super sh
_ -> Square sub super sh a -> Vector sh a
forall sub super sh a.
(Natural sub, Natural super, C sh, Floating a) =>
Square sub super sh a -> Vector sh a
Banded.takeDiagonal (Square sub super sh a -> Vector sh a)
-> Square sub super sh a -> Vector sh a
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a
-> PlainArray pack property lower upper Shape Small Small sh sh a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector Quadratic pack property lower upper sh a
a
      Omni.BandedHermitian BandedHermitian offDiag sh
_ ->
         Vector sh (RealOf a) -> Vector sh a
forall sh a.
(C sh, Floating a) =>
Vector sh (RealOf a) -> Vector sh a
Vector.fromReal (Vector sh (RealOf a) -> Vector sh a)
-> Vector sh (RealOf a) -> Vector sh a
forall a b. (a -> b) -> a -> b
$ BandedHermitian offDiag sh a -> Vector sh (RealOf a)
forall offDiag size a.
(Natural offDiag, C size, Floating a) =>
BandedHermitian offDiag size a -> Vector size (RealOf a)
BandedHermitian.takeDiagonal (BandedHermitian offDiag sh a -> Vector sh (RealOf a))
-> BandedHermitian offDiag sh a -> Vector sh (RealOf a)
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a
-> PlainArray pack property lower upper Shape Small Small sh sh a
forall pack property lower upper meas vert horiz height width a.
ToPlain pack property lower upper meas vert horiz height width =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> PlainArray
     pack property lower upper meas vert horiz height width a
ArrMatrix.toVector Quadratic pack property lower upper sh a
a


identityFromShape ::
   (Shape.C sh, Class.Floating a) =>
   MatrixShape.Quadratic pack property lower upper sh ->
   Quadratic pack property lower upper sh a
identityFromShape :: Quadratic pack property lower upper sh
-> Quadratic pack property lower upper sh a
identityFromShape Quadratic pack property lower upper sh
omni =
   OmniArray pack property lower upper Shape Small Small sh sh a
-> Quadratic pack property lower upper 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 pack property lower upper Shape Small Small sh sh a
 -> Quadratic pack property lower upper sh a)
-> OmniArray pack property lower upper Shape Small Small sh sh a
-> Quadratic pack property lower upper sh a
forall a b. (a -> b) -> a -> b
$
   case Quadratic pack property lower upper sh
omni of
      Omni.Full Full Shape Small Small sh sh
_ ->
         (Full Shape Small Small sh sh
 -> Omni Unpacked property lower upper Shape Small Small sh sh)
-> (Order -> sh -> Array (Full Shape Small Small sh sh) a)
-> Quadratic pack property lower upper sh
-> Array
     (Omni Unpacked property lower upper Shape Small Small sh sh) a
forall shape omni sh a pack property lower upper.
(shape -> omni)
-> (Order -> sh -> Array shape a)
-> Quadratic pack property lower upper sh
-> Array omni a
identityOmni Full Shape Small Small sh sh
-> Omni Unpacked property lower upper Shape Small Small sh sh
forall property lower upper meas vert horiz height width.
(Property property, Strip lower, Strip upper) =>
Full meas vert horiz height width
-> Omni Unpacked property lower upper meas vert horiz height width
Omni.Full Order -> sh -> Array (Full Shape Small Small sh sh) a
forall sh a. (C sh, Floating a) => Order -> sh -> Square sh a
Square.identityOrder Quadratic pack property lower upper sh
omni
      Omni.UpperTriangular UpperTriangular sh
_ ->
         (UpperTriangular sh
 -> Omni Packed property Empty Filled Shape Small Small sh sh)
-> (Order -> sh -> Array (UpperTriangular sh) a)
-> Quadratic pack property lower upper sh
-> Array
     (Omni Packed property Empty Filled Shape Small Small sh sh) a
forall shape omni sh a pack property lower upper.
(shape -> omni)
-> (Order -> sh -> Array shape a)
-> Quadratic pack property lower upper sh
-> Array omni a
identityOmni UpperTriangular sh
-> Omni Packed property Empty Filled Shape Small Small sh sh
forall diag size.
TriDiag diag =>
UpperTriangular size
-> Omni Packed diag Empty Filled Shape Small Small size size
Omni.UpperTriangular Order -> sh -> Array (UpperTriangular sh) a
forall mirror uplo sh a.
(Mirror mirror, UpLo uplo, C sh, Floating a) =>
Order -> sh -> Mosaic mirror uplo sh a
Packed.identity Quadratic pack property lower upper sh
omni
      Omni.LowerTriangular LowerTriangular sh
_ ->
         (LowerTriangular sh
 -> Omni Packed property Filled Empty Shape Small Small sh sh)
-> (Order -> sh -> Array (LowerTriangular sh) a)
-> Quadratic pack property lower upper sh
-> Array
     (Omni Packed property Filled Empty Shape Small Small sh sh) a
forall shape omni sh a pack property lower upper.
(shape -> omni)
-> (Order -> sh -> Array shape a)
-> Quadratic pack property lower upper sh
-> Array omni a
identityOmni LowerTriangular sh
-> Omni Packed property Filled Empty Shape Small Small sh sh
forall diag size.
TriDiag diag =>
LowerTriangular size
-> Omni Packed diag Filled Empty Shape Small Small size size
Omni.LowerTriangular Order -> sh -> Array (LowerTriangular sh) a
forall mirror uplo sh a.
(Mirror mirror, UpLo uplo, C sh, Floating a) =>
Order -> sh -> Mosaic mirror uplo sh a
Packed.identity Quadratic pack property lower upper sh
omni
      Omni.Symmetric Symmetric sh
_ ->
         (Symmetric sh
 -> Omni Packed Symmetric Filled Filled Shape Small Small sh sh)
-> (Order -> sh -> Array (Symmetric sh) a)
-> Quadratic pack property lower upper sh
-> Array
     (Omni Packed Symmetric Filled Filled Shape Small Small sh sh) a
forall shape omni sh a pack property lower upper.
(shape -> omni)
-> (Order -> sh -> Array shape a)
-> Quadratic pack property lower upper sh
-> Array omni a
identityOmni Symmetric sh
-> Omni Packed Symmetric Filled Filled Shape Small Small sh sh
forall size.
Symmetric size
-> Omni Packed Symmetric Filled Filled Shape Small Small size size
Omni.Symmetric Order -> sh -> Array (Symmetric sh) a
forall mirror uplo sh a.
(Mirror mirror, UpLo uplo, C sh, Floating a) =>
Order -> sh -> Mosaic mirror uplo sh a
Packed.identity Quadratic pack property lower upper sh
omni
      Omni.Hermitian Hermitian sh
_ ->
         (Hermitian sh
 -> Omni
      Packed
      (Hermitian neg zero pos)
      Filled
      Filled
      Shape
      Small
      Small
      sh
      sh)
-> (Order -> sh -> Array (Hermitian sh) a)
-> Quadratic pack property lower upper sh
-> Array
     (Omni
        Packed
        (Hermitian neg zero pos)
        Filled
        Filled
        Shape
        Small
        Small
        sh
        sh)
     a
forall shape omni sh a pack property lower upper.
(shape -> omni)
-> (Order -> sh -> Array shape a)
-> Quadratic pack property lower upper sh
-> Array omni a
identityOmni Hermitian sh
-> Omni
     Packed
     (Hermitian neg zero pos)
     Filled
     Filled
     Shape
     Small
     Small
     sh
     sh
forall neg zero sub size.
(C neg, C zero, C sub) =>
Hermitian size
-> Omni
     Packed
     (Hermitian neg zero sub)
     Filled
     Filled
     Shape
     Small
     Small
     size
     size
Omni.Hermitian Order -> sh -> Array (Hermitian sh) a
forall mirror uplo sh a.
(Mirror mirror, UpLo uplo, C sh, Floating a) =>
Order -> sh -> Mosaic mirror uplo sh a
Packed.identity Quadratic pack property lower upper sh
omni
      Omni.Banded Banded sub super Shape Small Small sh sh
_ ->
         (Banded sub super Shape Small Small sh sh
 -> Omni
      Packed Arbitrary (Bands sub) (Bands super) Shape Small Small sh sh)
-> (Order
    -> sh -> Array (Banded sub super Shape Small Small sh sh) a)
-> Quadratic pack property lower upper sh
-> Array
     (Omni
        Packed Arbitrary (Bands sub) (Bands super) Shape Small Small sh sh)
     a
forall shape omni sh a pack property lower upper.
(shape -> omni)
-> (Order -> sh -> Array shape a)
-> Quadratic pack property lower upper sh
-> Array omni a
identityOmni 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 Order -> sh -> Array (Banded sub super Shape Small Small sh sh) a
forall sub super size a.
(Natural sub, Natural super, C size, Floating a) =>
Order -> size -> Square sub super size a
Banded.identityFatOrder Quadratic pack property lower upper sh
omni
      Omni.UnitBandedTriangular BandedSquare sub super sh
_ ->
         (BandedSquare sub super sh
 -> Omni
      Packed Unit (Bands sub) (Bands super) Shape Small Small sh sh)
-> (Order -> sh -> Array (BandedSquare sub super sh) a)
-> Quadratic pack property lower upper sh
-> Array
     (Omni
        Packed Unit (Bands sub) (Bands super) Shape Small Small sh sh)
     a
forall shape omni sh a pack property lower upper.
(shape -> omni)
-> (Order -> sh -> Array shape a)
-> Quadratic pack property lower upper sh
-> Array omni a
identityOmni BandedSquare sub super sh
-> Omni
     Packed Unit (Bands sub) (Bands super) Shape Small Small sh sh
forall sub super size.
(BandedTriangular sub super, BandedTriangular super sub) =>
BandedSquare sub super size
-> Omni
     Packed Unit (Bands sub) (Bands super) Shape Small Small size size
Omni.UnitBandedTriangular Order -> sh -> Array (BandedSquare sub super sh) a
forall sub super size a.
(Natural sub, Natural super, C size, Floating a) =>
Order -> size -> Square sub super size a
Banded.identityFatOrder Quadratic pack property lower upper sh
omni
      Omni.BandedHermitian BandedHermitian offDiag sh
_ ->
         (BandedHermitian offDiag sh
 -> Omni
      Packed
      (Hermitian neg zero pos)
      (Bands offDiag)
      (Bands offDiag)
      Shape
      Small
      Small
      sh
      sh)
-> (Order -> sh -> Array (BandedHermitian offDiag sh) a)
-> Quadratic pack property lower upper sh
-> Array
     (Omni
        Packed
        (Hermitian neg zero pos)
        (Bands offDiag)
        (Bands offDiag)
        Shape
        Small
        Small
        sh
        sh)
     a
forall shape omni sh a pack property lower upper.
(shape -> omni)
-> (Order -> sh -> Array shape a)
-> Quadratic pack property lower upper sh
-> Array omni a
identityOmni BandedHermitian offDiag sh
-> Omni
     Packed
     (Hermitian neg zero pos)
     (Bands offDiag)
     (Bands offDiag)
     Shape
     Small
     Small
     sh
     sh
forall neg zero pos offDiag size.
(C neg, C zero, C pos, Natural offDiag) =>
BandedHermitian offDiag size
-> Omni
     Packed
     (Hermitian neg zero pos)
     (Bands offDiag)
     (Bands offDiag)
     Shape
     Small
     Small
     size
     size
Omni.BandedHermitian
            Order -> sh -> Array (BandedHermitian offDiag sh) a
forall offDiag sh a.
(Natural offDiag, C sh, Floating a) =>
Order -> sh -> BandedHermitian offDiag sh a
BandedHermitian.identityFatOrder Quadratic pack property lower upper sh
omni

identityOmni ::
   (shape -> omni) ->
   (Layout.Order -> sh -> Array shape a) ->
   MatrixShape.Quadratic pack property lower upper sh -> Array omni a
identityOmni :: (shape -> omni)
-> (Order -> sh -> Array shape a)
-> Quadratic pack property lower upper sh
-> Array omni a
identityOmni shape -> omni
consOmni Order -> sh -> Array shape a
eye Quadratic pack property lower upper sh
omni =
   (shape -> omni) -> Array shape a -> Array omni a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape shape -> omni
consOmni (Array shape a -> Array omni a) -> Array shape a -> Array omni a
forall a b. (a -> b) -> a -> b
$ Order -> sh -> Array shape a
eye (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) (Quadratic pack property lower upper sh -> sh
forall pack property lower upper sh.
Omni pack property lower upper Shape Small Small sh sh -> sh
Omni.squareSize Quadratic pack property lower upper sh
omni)

identityFrom ::
   (Shape.C sh, Class.Floating a) =>
   Quadratic pack property lower upper sh a ->
   Quadratic pack property lower upper sh a
identityFrom :: Quadratic pack property lower upper sh a
-> Quadratic pack property lower upper sh a
identityFrom = Quadratic pack property lower upper sh
-> Quadratic pack property lower upper sh a
forall sh a pack property lower upper.
(C sh, Floating a) =>
Quadratic pack property lower upper sh
-> Quadratic pack property lower upper sh a
identityFromShape (Quadratic pack property lower upper sh
 -> Quadratic pack property lower upper sh a)
-> (Quadratic pack property lower upper sh a
    -> Quadratic pack property lower upper sh)
-> Quadratic pack property lower upper sh a
-> Quadratic pack property lower upper sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Quadratic pack property lower upper sh a
-> Quadratic pack property lower upper 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

identityOrder ::
   (Omni.Quadratic pack property lower upper, Shape.C sh, Class.Floating a) =>
   Layout.Order -> sh -> Quadratic pack property lower upper sh a
identityOrder :: Order -> sh -> Quadratic pack property lower upper sh a
identityOrder Order
order sh
sh = Quadratic pack property lower upper sh
-> Quadratic pack property lower upper sh a
forall sh a pack property lower upper.
(C sh, Floating a) =>
Quadratic pack property lower upper sh
-> Quadratic pack property lower upper sh a
identityFromShape (Quadratic pack property lower upper sh
 -> Quadratic pack property lower upper sh a)
-> Quadratic pack property lower upper sh
-> Quadratic pack property lower upper sh a
forall a b. (a -> b) -> a -> b
$ 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
sh


signNegativeDeterminant ::
   (Shape.C sh, Class.Floating a) =>
   MatrixShape.Quadratic pack property lower upper sh -> a
signNegativeDeterminant :: Quadratic pack property lower upper sh -> a
signNegativeDeterminant Quadratic pack property lower upper sh
shape =
   a
forall a. Floating a => a
Scalar.minusOne a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ Int -> Int -> Int
forall a. Integral a => a -> a -> a
mod (sh -> Int
forall sh. C sh => sh -> Int
Shape.size (Quadratic pack property lower upper sh -> sh
forall pack property lower upper sh.
Omni pack property lower upper Shape Small Small sh sh -> sh
Omni.squareSize Quadratic pack property lower upper sh
shape)) Int
2