{-# LANGUAGE TypeFamilies #-}
module Numeric.LAPACK.Matrix.Array.Mosaic where
import qualified Numeric.LAPACK.Matrix.Mosaic.Basic as Mosaic
import qualified Numeric.LAPACK.Matrix.Array.Private as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Shape.Omni as Omni
import qualified Numeric.LAPACK.Matrix.Layout.Private as Layout
import qualified Numeric.LAPACK.Matrix.Extent.Private as Extent
import Numeric.LAPACK.Matrix.Array.Private (Square, Quadratic, FullQuadratic)
import Numeric.LAPACK.Matrix.Shape.Omni (Arbitrary, Unit)
import Numeric.LAPACK.Matrix.Layout.Private
(Empty, Filled, Bands, Packed, Unpacked)
import qualified Numeric.Netlib.Class as Class
import qualified Type.Data.Num.Unary.Literal as TypeNum
import qualified Data.Array.Comfort.Storable.Unchecked as Array
import qualified Data.Array.Comfort.Shape as Shape
type Symmetric sh = SymmetricP Packed sh
type SymmetricP pack sh = FullQuadratic pack Omni.Symmetric sh
type Hermitian sh = HermitianP Packed sh
type HermitianP pack sh =
FullQuadratic pack Omni.HermitianUnknownDefiniteness sh
type HermitianPosDef sh = HermitianPosDefP Packed sh
type HermitianPosDefP pack sh =
FullQuadratic pack Omni.HermitianPositiveDefinite sh
type HermitianPosSemidef sh = HermitianPosSemidefP Packed sh
type HermitianPosSemidefP pack sh =
FullQuadratic pack Omni.HermitianPositiveSemidefinite sh
type FlexHermitian neg zero pos sh = FlexHermitianP Packed neg zero pos sh
type FlexHermitianP pack neg zero pos sh =
FullQuadratic pack (Omni.Hermitian neg zero pos) sh
type Lower sh = FlexLower Arbitrary sh
type Upper sh = FlexUpper Arbitrary sh
type LowerP pack sh = FlexLowerP pack Arbitrary sh
type UpperP pack sh = FlexUpperP pack Arbitrary sh
type UnitLower sh = FlexLower Unit sh
type UnitUpper sh = FlexUpper Unit sh
type UnitLowerP pack sh = FlexLowerP pack Unit sh
type UnitUpperP pack sh = FlexUpperP pack Unit sh
type FlexLower diag sh = Quadratic Packed diag Filled Empty sh
type FlexUpper diag sh = Quadratic Packed diag Empty Filled sh
type FlexLowerP pack diag sh = Quadratic pack diag Filled Empty sh
type FlexUpperP pack diag sh = Quadratic pack diag Empty Filled sh
type QuasiUpper sh = Quadratic Unpacked Arbitrary (Bands TypeNum.U1) Filled sh
type Triangular lo diag up sh = TriangularP Packed lo diag up sh
type TriangularP pack lo diag up sh = Quadratic pack diag lo up sh
assureMirrored ::
(Layout.Packing pack, Layout.Mirror mirror, Layout.UpLo uplo) =>
(meas ~ Extent.Shape, vert ~ Extent.Small, horiz ~ Extent.Small) =>
(Omni.FromPlain pack prop lower upper meas vert horiz sh sh) =>
(Omni.Plain pack prop lower upper meas vert horiz sh sh
~
Layout.Mosaic pack mirror uplo sh) =>
(Shape.C sh, Class.Floating a) =>
Square sh a -> Quadratic pack prop lower upper sh a
assureMirrored =
ArrMatrix.lift0 . Mosaic.repack .
Array.mapShape Layout.mosaicFromSquare . ArrMatrix.toVector