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

import qualified Numeric.LAPACK.Matrix.HermitianPositiveDefinite as HermitianPD
import qualified Numeric.LAPACK.Matrix.Hermitian as Hermitian
import qualified Numeric.LAPACK.Matrix.Symmetric as Symmetric
import qualified Numeric.LAPACK.Matrix.Triangular as Triangular
import qualified Numeric.LAPACK.Matrix.Square.Linear as SquareLin
import qualified Numeric.LAPACK.Matrix.Square as Square
import qualified Numeric.LAPACK.Matrix.Banded.Linear as BandedLin
import qualified Numeric.LAPACK.Matrix.BandedHermitianPositiveDefinite
                  as BandedHermitianPD
import qualified Numeric.LAPACK.Matrix.BandedHermitian as BandedHermitian
import qualified Numeric.LAPACK.Matrix.Banded as Banded

import qualified Numeric.LAPACK.Matrix.Array.Basic as OmniMatrix
import qualified Numeric.LAPACK.Matrix.Array.Private as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Shape.Omni as Omni
import qualified Numeric.LAPACK.Matrix.Shape as MatrixShape
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.Multiply (Factor(..), factorSingleton)
import Numeric.LAPACK.Matrix.Array.Private (Full, Quadratic, QuadraticMeas)

import qualified Numeric.Netlib.Class as Class

import qualified Type.Data.Bool as TBool

import qualified Data.Array.Comfort.Storable.Unchecked as Array
import qualified Data.Array.Comfort.Shape as Shape


determinant ::
   (Layout.Packing pack, Omni.Property property,
    Omni.Strip lower, Omni.Strip upper,
    Shape.C sh, Class.Floating a) =>
   Quadratic pack property lower upper sh a -> a
determinant :: Quadratic pack property lower upper sh a -> a
determinant Quadratic pack property lower upper sh a
a =
   let shape :: Omni pack property lower upper Shape Small Small sh sh
shape = 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 in
   case Omni pack property lower upper Shape Small Small sh sh
-> Factor pack property lower upper Shape Small Small sh sh
forall pack property lower upper meas vert horiz height width.
(Packing pack, Property property, Strip lower, Strip upper,
 Measure meas, C vert, C horiz) =>
Omni pack property lower upper meas vert horiz height width
-> Factor pack property lower upper meas vert horiz height width
factorSingleton Omni pack property lower upper Shape Small Small sh sh
shape of
      Factor pack property lower upper Shape Small Small sh sh
FactorFull -> Square sh a -> a
forall sh a. (C sh, Floating a) => Square sh a -> a
Square.determinant (Square sh a -> a) -> Square sh a -> a
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a -> Square sh a
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
OmniMatrix.toFull Quadratic pack property lower upper sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorUpperTriangular ->
         case Quadratic pack property lower upper sh a -> DiagSingleton property
forall diag pack lower upper meas vert horiz height width a.
TriDiag diag =>
ArrayMatrix pack diag lower upper meas vert horiz height width a
-> DiagSingleton diag
ArrMatrix.diagTag Quadratic pack property lower upper sh a
a of
            DiagSingleton property
MatrixShape.Unit -> a
forall a. Floating a => a
Scalar.one
            DiagSingleton property
MatrixShape.Arbitrary -> Quadratic pack property lower upper sh a -> a
forall pack lo up diag sh a.
(Packing pack, UpLo lo up, TriDiag diag, C sh, Floating a) =>
TriangularP pack lo diag up sh a -> a
Triangular.determinant Quadratic pack property lower upper sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorLowerTriangular ->
         case Quadratic pack property lower upper sh a -> DiagSingleton property
forall diag pack lower upper meas vert horiz height width a.
TriDiag diag =>
ArrayMatrix pack diag lower upper meas vert horiz height width a
-> DiagSingleton diag
ArrMatrix.diagTag Quadratic pack property lower upper sh a
a of
            DiagSingleton property
MatrixShape.Unit -> a
forall a. Floating a => a
Scalar.one
            DiagSingleton property
MatrixShape.Arbitrary -> Quadratic pack property lower upper sh a -> a
forall pack lo up diag sh a.
(Packing pack, UpLo lo up, TriDiag diag, C sh, Floating a) =>
TriangularP pack lo diag up sh a -> a
Triangular.determinant Quadratic pack property lower upper sh a
a

      Factor pack property lower upper Shape Small Small sh sh
FactorSymmetric -> SymmetricP pack sh a -> a
forall pack sh a.
(Packing pack, C sh, Floating a) =>
SymmetricP pack sh a -> a
Symmetric.determinant Quadratic pack property lower upper sh a
SymmetricP pack sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorHermitian -> RealOf a -> a
forall a. Floating a => RealOf a -> a
Scalar.fromReal (RealOf a -> a) -> RealOf a -> a
forall a b. (a -> b) -> a -> b
$ FlexHermitianP pack neg zero pos sh a -> RealOf a
forall pack neg zero pos sh a.
(Packing pack, C neg, C zero, C pos, C sh, Floating a) =>
FlexHermitianP pack neg zero pos sh a -> RealOf a
Hermitian.determinant Quadratic pack property lower upper sh a
FlexHermitianP pack neg zero pos sh a
a

      Factor pack property lower upper Shape Small Small sh sh
FactorBanded -> Quadratic property sub super sh a -> a
forall diag sub super sh a.
(TriDiag diag, Natural sub, Natural super, C sh, Floating a) =>
Quadratic diag sub super sh a -> a
Banded.determinant Quadratic pack property lower upper sh a
Quadratic property sub super sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorUnitBandedTriangular -> a
forall a. Floating a => a
Scalar.one
      Factor pack property lower upper Shape Small Small sh sh
FactorBandedHermitian ->
         case Omni
  pack (Hermitian neg zero pos) lower upper Shape Small Small sh sh
-> (Singleton neg, Singleton zero, Singleton pos)
forall neg zero pos pack lower upper meas vert horiz height width.
(C neg, C zero, C pos) =>
Omni
  pack
  (Hermitian neg zero pos)
  lower
  upper
  meas
  vert
  horiz
  height
  width
-> (Singleton neg, Singleton zero, Singleton pos)
Omni.hermitianSet Omni pack property lower upper Shape Small Small sh sh
Omni
  pack (Hermitian neg zero pos) lower upper Shape Small Small sh sh
shape of
            (Singleton neg
TBool.False, Singleton zero
TBool.False, Singleton pos
TBool.True) ->
               RealOf a -> a
forall a. Floating a => RealOf a -> a
Scalar.fromReal (RealOf a -> a) -> RealOf a -> a
forall a b. (a -> b) -> a -> b
$ HermitianPosDef offDiag sh a -> RealOf a
forall offDiag size a.
(Natural offDiag, C size, Floating a) =>
HermitianPosDef offDiag size a -> RealOf a
BandedHermitianPD.determinant Quadratic pack property lower upper sh a
HermitianPosDef offDiag sh a
a
            (Singleton neg
TBool.True, Singleton zero
TBool.False, Singleton pos
TBool.False) ->
               (Omni pack property lower upper Shape Small Small sh sh -> a
forall sh a pack property lower upper.
(C sh, Floating a) =>
Quadratic pack property lower upper sh -> a
OmniMatrix.signNegativeDeterminant Omni pack property lower upper Shape Small Small sh sh
shape a -> a -> a
forall a. Num a => a -> a -> a
*) (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ RealOf a -> a
forall a. Floating a => RealOf a -> a
Scalar.fromReal (RealOf a -> a) -> RealOf a -> a
forall a b. (a -> b) -> a -> b
$
               HermitianPosDef offDiag sh a -> RealOf a
forall offDiag size a.
(Natural offDiag, C size, Floating a) =>
HermitianPosDef offDiag size a -> RealOf a
BandedHermitianPD.determinant (HermitianPosDef offDiag sh a -> RealOf a)
-> HermitianPosDef offDiag sh a -> RealOf a
forall a b. (a -> b) -> a -> b
$ AnyHermitianP pack True False False lower sh a
-> AnyHermitianP pack False False True lower sh a
forall neg zero pos sh a pack bands.
(C neg, C zero, C pos, C sh, Floating a) =>
AnyHermitianP pack neg zero pos bands sh a
-> AnyHermitianP pack pos zero neg bands sh a
Hermitian.negate Quadratic pack property lower upper sh a
AnyHermitianP pack True False False lower sh a
a
            (Singleton neg, Singleton zero, Singleton pos)
_ -> Quadratic Arbitrary offDiag offDiag sh a -> a
forall diag sub super sh a.
(TriDiag diag, Natural sub, Natural super, C sh, Floating a) =>
Quadratic diag sub super sh a -> a
Banded.determinant (Quadratic Arbitrary offDiag offDiag sh a -> a)
-> Quadratic Arbitrary offDiag offDiag sh a -> a
forall a b. (a -> b) -> a -> b
$ FlexHermitian neg zero pos offDiag sh a
-> Quadratic Arbitrary offDiag offDiag sh a
forall neg zero pos offDiag size a.
(C neg, C zero, C pos, Natural offDiag, C size, Floating a) =>
FlexHermitian neg zero pos offDiag size a
-> Square offDiag offDiag size a
BandedHermitian.toBanded Quadratic pack property lower upper sh a
FlexHermitian neg zero pos offDiag sh a
a


{- |
We use the solvers for positive definite Hermitian matrices
also for negative definite matrices.
We even use them for semidefinite matrices,
because semidefinite matrices with full rank are definite.
-}
solve ::
   (Layout.Packing pack, Omni.Property property,
    Omni.Strip lower, Omni.Strip upper,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C sh, Eq sh, Shape.C nrhs, Class.Floating a) =>
   Quadratic pack property lower upper sh a ->
   Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
solve :: Quadratic pack property lower upper sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
solve Quadratic pack property lower upper sh a
a =
   case Omni pack property lower upper Shape Small Small sh sh
-> Factor pack property lower upper Shape Small Small sh sh
forall pack property lower upper meas vert horiz height width.
(Packing pack, Property property, Strip lower, Strip upper,
 Measure meas, C vert, C horiz) =>
Omni pack property lower upper meas vert horiz height width
-> Factor pack property lower upper meas vert horiz height width
factorSingleton (Omni pack property lower upper Shape Small Small sh sh
 -> Factor pack property lower upper Shape Small Small sh sh)
-> Omni pack property lower upper Shape Small Small sh sh
-> Factor pack property lower upper Shape Small Small sh sh
forall a b. (a -> b) -> a -> b
$ 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
      Factor pack property lower upper Shape Small Small sh sh
FactorFull -> Square sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall meas vert horiz sh nrhs a.
(Measure meas, C vert, C horiz, C sh, Eq sh, C nrhs, Floating a) =>
Square sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
Square.solve (Square sh a
 -> Full meas vert horiz sh nrhs a
 -> Full meas vert horiz sh nrhs a)
-> Square sh a
-> Full meas vert horiz sh nrhs a
-> Full meas vert horiz sh nrhs a
forall a b. (a -> b) -> a -> b
$ Quadratic pack property lower upper sh a -> Square sh a
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
OmniMatrix.toFull Quadratic pack property lower upper sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorUpperTriangular -> Quadratic pack property lower upper sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall pack lo up diag meas vert horiz sh nrhs a.
(Packing pack, UpLo lo up, TriDiag diag, Measure meas, C vert,
 C horiz, C sh, Eq sh, C nrhs, Floating a) =>
TriangularP pack lo diag up sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
Triangular.solve Quadratic pack property lower upper sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorLowerTriangular -> Quadratic pack property lower upper sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall pack lo up diag meas vert horiz sh nrhs a.
(Packing pack, UpLo lo up, TriDiag diag, Measure meas, C vert,
 C horiz, C sh, Eq sh, C nrhs, Floating a) =>
TriangularP pack lo diag up sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
Triangular.solve Quadratic pack property lower upper sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorSymmetric -> SymmetricP pack sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall pack meas vert horiz sh nrhs a.
(Packing pack, Measure meas, C vert, C horiz, C sh, Eq sh, C nrhs,
 Floating a) =>
SymmetricP pack sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
Symmetric.solve Quadratic pack property lower upper sh a
SymmetricP pack sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorHermitian -> FlexHermitianP pack neg zero pos sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall pack neg zero pos meas vert horiz sh nrhs a.
(Packing pack, C neg, C zero, C pos, Measure meas, C vert, C horiz,
 C sh, Eq sh, C nrhs, Floating a) =>
FlexHermitianP pack neg zero pos sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
Hermitian.solve Quadratic pack property lower upper sh a
FlexHermitianP pack neg zero pos sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorBanded -> Quadratic property sub super sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall diag sub super meas vert horiz sh nrhs a.
(TriDiag diag, Natural sub, Natural super, Measure meas, C vert,
 C horiz, C sh, Eq sh, C nrhs, Floating a) =>
Quadratic diag sub super sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
Banded.solve Quadratic pack property lower upper sh a
Quadratic property sub super sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorUnitBandedTriangular ->
         (PlainArray pack property lower upper Shape Small Small sh sh a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz sh nrhs a
 -> PlainArray
      Unpacked Arbitrary Filled Filled meas vert horiz sh nrhs a)
-> Quadratic pack property lower upper sh a
-> Full meas vert horiz sh nrhs a
-> Full meas vert horiz sh nrhs a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB packC
       propC lowerC upperC measC vertC horizC heightC widthC a b c.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 ToPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB,
 FromPlain
   packC propC lowerC upperC measC vertC horizC heightC widthC) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b
 -> PlainArray
      packC propC lowerC upperC measC vertC horizC heightC widthC c)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
-> ArrayMatrix
     packC propC lowerC upperC measC vertC horizC heightC widthC c
ArrMatrix.lift2 (DiagSingleton Unit
-> Square sub super sh a
-> Full meas vert horiz sh nrhs a
-> Full meas vert horiz sh nrhs a
forall sub super diag meas vert horiz sh nrhs a.
(BandedTriangular sub super, TriDiag diag, Measure meas, C vert,
 C horiz, C sh, Eq sh, C nrhs, Floating a) =>
DiagSingleton diag
-> Square sub super sh a
-> Full meas vert horiz sh nrhs a
-> Full meas vert horiz sh nrhs a
BandedLin.solveTriangular DiagSingleton Unit
MatrixShape.Unit) Quadratic pack property lower upper sh a
a
      Factor pack property lower upper Shape Small Small sh sh
FactorBandedHermitian ->
         case Omni
  pack (Hermitian neg zero pos) lower upper Shape Small Small sh sh
-> (Singleton neg, Singleton zero, Singleton pos)
forall neg zero pos pack lower upper meas vert horiz height width.
(C neg, C zero, C pos) =>
Omni
  pack
  (Hermitian neg zero pos)
  lower
  upper
  meas
  vert
  horiz
  height
  width
-> (Singleton neg, Singleton zero, Singleton pos)
Omni.hermitianSet (Omni
   pack (Hermitian neg zero pos) lower upper Shape Small Small sh sh
 -> (Singleton neg, Singleton zero, Singleton pos))
-> Omni
     pack (Hermitian neg zero pos) lower upper Shape Small Small sh sh
-> (Singleton neg, Singleton zero, Singleton pos)
forall a b. (a -> b) -> a -> b
$ 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
            (Singleton neg
TBool.False, Singleton zero
_, Singleton pos
TBool.True) ->
               HermitianPosDef offDiag sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall offDiag size meas vert horiz nrhs a.
(Natural offDiag, C size, Eq size, Measure meas, C vert, C horiz,
 C nrhs, Floating a) =>
HermitianPosDef offDiag size a
-> Full meas vert horiz size nrhs a
-> Full meas vert horiz size nrhs a
BandedHermitianPD.solve (AnyHermitianP pack False zero True lower sh a
-> AnyHermitianP pack False False True lower sh a
forall neg pos zero pack bands sh a.
(Semidefinite neg pos, C zero) =>
AnyHermitianP pack neg zero pos bands sh a
-> AnyHermitianP pack neg False pos bands sh a
HermitianPD.assureFullRank Quadratic pack property lower upper sh a
AnyHermitianP pack False zero True lower sh a
a)
            (Singleton neg
TBool.True, Singleton zero
_, Singleton pos
TBool.False) ->
               Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall property meas vert horiz height width a pack lower upper.
(Homogeneous property, Measure meas, C vert, C horiz, C height,
 C width, Floating a) =>
ArrayMatrix
  pack property lower upper meas vert horiz height width a
-> ArrayMatrix
     pack property lower upper meas vert horiz height width a
ArrMatrix.negate (Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a)
-> (Full meas vert horiz sh nrhs a
    -> Full meas vert horiz sh nrhs a)
-> Full meas vert horiz sh nrhs a
-> Full meas vert horiz sh nrhs a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
               HermitianPosDef offDiag sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall offDiag size meas vert horiz nrhs a.
(Natural offDiag, C size, Eq size, Measure meas, C vert, C horiz,
 C nrhs, Floating a) =>
HermitianPosDef offDiag size a
-> Full meas vert horiz size nrhs a
-> Full meas vert horiz size nrhs a
BandedHermitianPD.solve
                  (AnyHermitianP pack True False False lower sh a
-> AnyHermitianP pack False False True lower sh a
forall neg zero pos sh a pack bands.
(C neg, C zero, C pos, C sh, Floating a) =>
AnyHermitianP pack neg zero pos bands sh a
-> AnyHermitianP pack pos zero neg bands sh a
Hermitian.negate (AnyHermitianP pack True False False lower sh a
 -> AnyHermitianP pack False False True lower sh a)
-> AnyHermitianP pack True False False lower sh a
-> AnyHermitianP pack False False True lower sh a
forall a b. (a -> b) -> a -> b
$ AnyHermitianP pack True zero False lower sh a
-> AnyHermitianP pack True False False lower sh a
forall neg pos zero pack bands sh a.
(Semidefinite neg pos, C zero) =>
AnyHermitianP pack neg zero pos bands sh a
-> AnyHermitianP pack neg False pos bands sh a
HermitianPD.assureFullRank Quadratic pack property lower upper sh a
AnyHermitianP pack True zero False lower sh a
a)
            (Singleton neg, Singleton zero, Singleton pos)
_ -> Quadratic Arbitrary offDiag offDiag sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
forall diag sub super meas vert horiz sh nrhs a.
(TriDiag diag, Natural sub, Natural super, Measure meas, C vert,
 C horiz, C sh, Eq sh, C nrhs, Floating a) =>
Quadratic diag sub super sh a
-> Full meas vert horiz sh nrhs a -> Full meas vert horiz sh nrhs a
Banded.solve (Quadratic Arbitrary offDiag offDiag sh a
 -> Full meas vert horiz sh nrhs a
 -> Full meas vert horiz sh nrhs a)
-> Quadratic Arbitrary offDiag offDiag sh a
-> Full meas vert horiz sh nrhs a
-> Full meas vert horiz sh nrhs a
forall a b. (a -> b) -> a -> b
$ FlexHermitian neg zero pos offDiag sh a
-> Quadratic Arbitrary offDiag offDiag sh a
forall neg zero pos offDiag size a.
(C neg, C zero, C pos, Natural offDiag, C size, Floating a) =>
FlexHermitian neg zero pos offDiag size a
-> Square offDiag offDiag size a
BandedHermitian.toBanded Quadratic pack property lower upper sh a
FlexHermitian neg zero pos offDiag sh a
a


inverse ::
   (Layout.Packing pack, Omni.Property property,
    MatrixShape.PowerStrip lower, MatrixShape.PowerStrip upper,
    Extent.Measure meas, Shape.C height, Shape.C width, Class.Floating a) =>
   QuadraticMeas pack property lower upper meas height width a ->
   QuadraticMeas pack property lower upper meas width height a
inverse :: QuadraticMeas pack property lower upper meas height width a
-> QuadraticMeas pack property lower upper meas width height a
inverse QuadraticMeas pack property lower upper meas height width a
a =
   case Omni pack property lower upper meas Small Small height width
-> Power pack property lower upper meas Small Small height width
forall pack property lower upper meas vert horiz height width.
(Packing pack, Property property, PowerStrip lower,
 PowerStrip upper, Measure meas, C vert, C horiz) =>
Omni pack property lower upper meas vert horiz height width
-> Power pack property lower upper meas vert horiz height width
Omni.powerSingleton (Omni pack property lower upper meas Small Small height width
 -> Power pack property lower upper meas Small Small height width)
-> Omni pack property lower upper meas Small Small height width
-> Power pack property lower upper meas Small Small height width
forall a b. (a -> b) -> a -> b
$ QuadraticMeas pack property lower upper meas height width a
-> Omni pack property lower upper meas Small Small 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 QuadraticMeas pack property lower upper meas height width a
a of
      Power pack property lower upper meas Small Small height width
Omni.PowerIdentity -> QuadraticMeas pack property lower upper meas height width a
QuadraticMeas pack property lower upper meas width height a
a
      Power pack property lower upper meas Small Small height width
Omni.PowerUpperTriangular -> TriangularP pack lower property upper height a
-> TriangularP pack lower property upper height a
forall pack lo up diag sh a.
(Packing pack, UpLo lo up, TriDiag diag, C sh, Floating a) =>
TriangularP pack lo diag up sh a
-> TriangularP pack lo diag up sh a
Triangular.inverse QuadraticMeas pack property lower upper meas height width a
TriangularP pack lower property upper height a
a
      Power pack property lower upper meas Small Small height width
Omni.PowerLowerTriangular -> TriangularP pack lower property upper height a
-> TriangularP pack lower property upper height a
forall pack lo up diag sh a.
(Packing pack, UpLo lo up, TriDiag diag, C sh, Floating a) =>
TriangularP pack lo diag up sh a
-> TriangularP pack lo diag up sh a
Triangular.inverse QuadraticMeas pack property lower upper meas height width a
TriangularP pack lower property upper height a
a
      Power pack property lower upper meas Small Small height width
Omni.PowerSymmetric -> SymmetricP pack height a -> SymmetricP pack height a
forall pack sh a.
(Packing pack, C sh, Floating a) =>
SymmetricP pack sh a -> SymmetricP pack sh a
Symmetric.inverse QuadraticMeas pack property lower upper meas height width a
SymmetricP pack height a
a
      Power pack property lower upper meas Small Small height width
Omni.PowerHermitian -> FlexHermitianP pack neg zero pos height a
-> FlexHermitianP pack neg zero pos height a
forall pack neg zero pos sh a.
(Packing pack, C neg, C zero, C pos, C sh, Floating a) =>
FlexHermitianP pack neg zero pos sh a
-> FlexHermitianP pack neg zero pos sh a
Hermitian.inverse QuadraticMeas pack property lower upper meas height width a
FlexHermitianP pack neg zero pos height a
a
      Power pack property lower upper meas Small Small height width
Omni.PowerFull -> (FullArray meas Small Small height width a
 -> FullArray meas Small Small width height a)
-> UnpackedMatrix
     property lower upper meas Small Small height width a
-> UnpackedMatrix
     property lower upper meas Small Small width height 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 Small Small height width a
-> FullArray meas Small Small width height a
forall meas height width a.
(Measure meas, C height, C width, Floating a) =>
SquareMeas meas height width a -> SquareMeas meas width height a
SquareLin.inverse QuadraticMeas pack property lower upper meas height width a
UnpackedMatrix property lower upper meas Small Small height width a
a
      Power pack property lower upper meas Small Small height width
Omni.PowerDiagonal ->
         case QuadraticMeas pack property lower upper meas height width a
-> Omni pack property lower upper meas Small Small 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 QuadraticMeas pack property lower upper meas height width a
a of
            Omni.Banded Banded sub super meas Small Small height width
_ ->
               (PlainArray
   pack property lower upper meas Small Small height width a
 -> PlainArray
      pack property lower upper meas Small Small width height a)
-> QuadraticMeas pack property lower upper meas height width a
-> QuadraticMeas pack property lower upper meas width height 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
                  ((BandedSquareMeas U0 U0 meas height width
 -> BandedSquareMeas U0 U0 meas width height)
-> Array (BandedSquareMeas U0 U0 meas height width) a
-> Array (BandedSquareMeas U0 U0 meas width height) a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape BandedSquareMeas U0 U0 meas height width
-> BandedSquareMeas U0 U0 meas width height
forall meas height width.
Measure meas =>
BandedSquareMeas U0 U0 meas height width
-> BandedSquareMeas U0 U0 meas width height
Layout.diagonalInverse (Array (BandedSquareMeas U0 U0 meas height width) a
 -> Array (BandedSquareMeas U0 U0 meas width height) a)
-> (Array (BandedSquareMeas U0 U0 meas height width) a
    -> Array (BandedSquareMeas U0 U0 meas height width) a)
-> Array (BandedSquareMeas U0 U0 meas height width) a
-> Array (BandedSquareMeas U0 U0 meas width height) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array (BandedSquareMeas U0 U0 meas height width) a
-> Array (BandedSquareMeas U0 U0 meas height width) a
forall sh a. (C sh, Floating a) => Vector sh a -> Vector sh a
Vector.recip) QuadraticMeas pack property lower upper meas height width a
a
            Omni.BandedHermitian BandedHermitian offDiag height
_ -> (PlainArray
   pack property lower upper meas Small Small height width a
 -> PlainArray
      pack property lower upper meas Small Small width height a)
-> QuadraticMeas pack property lower upper meas height width a
-> QuadraticMeas pack property lower upper meas width height 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 Small Small height width a
-> PlainArray
     pack property lower upper meas Small Small width height a
forall sh a. (C sh, Floating a) => Vector sh a -> Vector sh a
Vector.recip QuadraticMeas pack property lower upper meas height width a
a
            Omni.UnitBandedTriangular BandedSquare sub super height
_ -> QuadraticMeas pack property lower upper meas height width a
QuadraticMeas pack property lower upper meas width height a
a
            Omni.Full Full meas Small Small height width
_ -> (FullArray meas Small Small height width a
 -> FullArray meas Small Small width height a)
-> UnpackedMatrix
     property lower upper meas Small Small height width a
-> UnpackedMatrix
     property lower upper meas Small Small width height 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 Small Small height width a
-> FullArray meas Small Small width height a
forall meas height width a.
(Measure meas, C height, C width, Floating a) =>
SquareMeas meas height width a -> SquareMeas meas width height a
SquareLin.inverse QuadraticMeas pack property lower upper meas height width a
UnpackedMatrix property lower upper meas Small Small height width a
a