{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
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 :: forall pack property lower upper vert horiz
       (matrix :: * -> * -> * -> *) heightA heightB width a.
(ArrayMatrix pack property lower upper Size vert horiz ~ matrix,
 C vert, C horiz, C heightA, C heightB, C width) =>
(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 heightB width a
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 heightB width a)
-> (matrix heightA width a
    -> OmniArray
         pack property lower upper Size vert horiz heightB width a)
-> matrix heightA width a
-> matrix 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)
-> (matrix heightA width a
    -> Array
         (Omni pack property lower upper Size vert horiz heightA width) a)
-> matrix heightA width a
-> OmniArray
     pack property lower upper Size vert horiz heightB width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. matrix 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
-> 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 :: forall pack property lower upper vert horiz
       (matrix :: * -> * -> * -> *) widthA widthB height a.
(ArrayMatrix pack property lower upper Size vert horiz ~ matrix,
 C vert, C horiz, C widthA, C widthB, C height) =>
(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 height widthB a
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 height widthB a)
-> (matrix height widthA a
    -> OmniArray
         pack property lower upper Size vert horiz height widthB a)
-> matrix height widthA a
-> matrix 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)
-> (matrix height widthA a
    -> Array
         (Omni pack property lower upper Size vert horiz height widthA) a)
-> matrix height widthA a
-> OmniArray
     pack property lower upper Size vert horiz height widthB a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. matrix 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
-> 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 :: 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
mapSquareSize shA -> shB
f =
   OmniArray pack property lower upper Shape Small Small shB shB a
-> Matrix
     (Array pack property) () () lower upper Shape Small Small shB 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
 -> Matrix
      (Array pack property)
      ()
      ()
      lower
      upper
      Shape
      Small
      Small
      shB
      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
-> Matrix
     (Array pack property) () () lower upper Shape Small Small shB 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 :: forall meas vert horiz height width a pack property lower upper.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
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 Triangular Upper height a -> Square height a
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 Triangular Lower height a -> Square height a
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 Mosaic SimpleMirror Upper height a -> Square height a
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 Mosaic ConjugateMirror Upper height a -> Square height a
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 Banded sub super meas vert horiz height width a
-> FullArray meas vert horiz height width a
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 Banded sub super Shape Small Small height height a
-> Square height a
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
-> Square 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
 -> Square height a)
-> (BandedHermitian offDiag height a
    -> Banded offDiag offDiag Shape Small Small height height a)
-> BandedHermitian offDiag height a
-> Square 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 :: forall meas vert horiz height width a pack property lower upper.
(Measure meas, C vert, C horiz, C height, C width, Floating a) =>
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 Mosaic Packed NoMirror Upper height a
-> Mosaic NoMirror Upper height a
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 Mosaic Packed NoMirror Lower height a
-> Mosaic NoMirror Lower height a
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 Mosaic Packed SimpleMirror Upper height a
-> Mosaic SimpleMirror Upper height a
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 Mosaic Packed ConjugateMirror Upper height a
-> Mosaic ConjugateMirror Upper height a
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 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 offDiag offDiag 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 offDiag offDiag meas vert horiz height width a
 -> FullArray meas vert horiz height width a)
-> Banded offDiag offDiag meas vert horiz height width a
-> FullArray meas vert horiz height width a
forall a b. (a -> b) -> a -> b
$
         BandedHermitian offDiag height a -> Square offDiag offDiag 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
 -> Square offDiag offDiag height a)
-> BandedHermitian offDiag height a
-> Square offDiag offDiag 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 :: forall sh a pack property lower upper.
(C sh, Floating a) =>
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 :: 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
omni =
   OmniArray pack property lower upper Shape Small Small sh sh a
-> Matrix
     (Array pack property) () () lower upper 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 pack property lower upper Shape Small Small sh sh a
 -> Matrix
      (Array pack property) () () lower upper Shape Small Small sh sh a)
-> OmniArray pack property lower upper Shape Small Small sh sh a
-> Matrix
     (Array pack property) () () lower upper Shape Small Small sh 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
 -> Quadratic pack property lower upper sh)
-> (Order -> sh -> Array (Full Shape Small Small sh sh) a)
-> Quadratic pack property lower upper sh
-> OmniArray pack 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
-> Quadratic pack property lower upper sh
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 -> Quadratic pack property lower upper sh)
-> (Order -> sh -> Array (UpperTriangular sh) a)
-> Quadratic pack property lower upper sh
-> OmniArray pack 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 UpperTriangular sh -> Quadratic pack property lower upper sh
UpperTriangular sh
-> Omni Packed property (Bands U0) Filled Shape Small Small sh sh
forall property height.
TriDiag property =>
UpperTriangular height
-> Omni
     Packed property (Bands U0) Filled Shape Small Small height height
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 -> Quadratic pack property lower upper sh)
-> (Order -> sh -> Array (LowerTriangular sh) a)
-> Quadratic pack property lower upper sh
-> OmniArray pack 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 LowerTriangular sh -> Quadratic pack property lower upper sh
LowerTriangular sh
-> Omni Packed property Filled (Bands U0) Shape Small Small sh sh
forall property height.
TriDiag property =>
LowerTriangular height
-> Omni
     Packed property Filled (Bands U0) Shape Small Small height height
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 -> Quadratic pack property lower upper sh)
-> (Order -> sh -> Array (Symmetric sh) a)
-> Quadratic pack property lower upper sh
-> OmniArray pack 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 Symmetric sh -> Quadratic pack property lower upper sh
Symmetric sh
-> Omni Packed Symmetric Filled Filled Shape Small Small sh sh
forall height.
Symmetric height
-> Omni
     Packed Symmetric Filled Filled Shape Small Small height height
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 -> Quadratic pack property lower upper sh)
-> (Order -> sh -> Array (Hermitian sh) a)
-> Quadratic pack property lower upper sh
-> OmniArray pack 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 Hermitian sh -> Quadratic pack property lower upper sh
Hermitian sh
-> Omni
     Packed
     (Hermitian neg zero pos)
     Filled
     Filled
     Shape
     Small
     Small
     sh
     sh
forall neg zero pos height.
(C neg, C zero, C pos) =>
Hermitian height
-> Omni
     Packed
     (Hermitian neg zero pos)
     Filled
     Filled
     Shape
     Small
     Small
     height
     height
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
 -> Quadratic pack property lower upper sh)
-> (Order
    -> sh -> Array (Banded sub super Shape Small Small sh sh) a)
-> Quadratic pack property lower upper sh
-> OmniArray pack 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 Banded sub super Shape Small Small sh sh
-> Quadratic pack property lower upper sh
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
 -> Quadratic pack property lower upper sh)
-> (Order -> sh -> Array (BandedSquare sub super sh) a)
-> Quadratic pack property lower upper sh
-> OmniArray pack 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 BandedSquare sub super sh -> Quadratic pack property lower upper sh
BandedSquare sub super sh
-> Omni
     Packed Unit (Bands sub) (Bands super) Shape Small Small sh sh
forall sub super height.
(BandedTriangular sub super, BandedTriangular super sub) =>
BandedSquare sub super height
-> Omni
     Packed
     Unit
     (Bands sub)
     (Bands super)
     Shape
     Small
     Small
     height
     height
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
 -> Quadratic pack property lower upper sh)
-> (Order -> sh -> Array (BandedHermitian offDiag sh) a)
-> Quadratic pack property lower upper sh
-> OmniArray pack 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 BandedHermitian offDiag sh
-> Quadratic pack property lower upper sh
BandedHermitian offDiag sh
-> Omni
     Packed
     (Hermitian neg zero pos)
     (Bands offDiag)
     (Bands offDiag)
     Shape
     Small
     Small
     sh
     sh
forall neg zero pos offDiag height.
(C neg, C zero, C pos, Natural offDiag) =>
BandedHermitian offDiag height
-> Omni
     Packed
     (Hermitian neg zero pos)
     (Bands offDiag)
     (Bands offDiag)
     Shape
     Small
     Small
     height
     height
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 :: 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 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 :: forall sh a pack property lower upper.
(C sh, Floating a) =>
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 :: 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
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 sh.
C sh =>
Order
-> sh -> Omni pack property lower upper Shape Small Small sh 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 :: forall sh a pack property lower upper.
(C sh, Floating a) =>
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