module Numeric.LAPACK.Matrix.Array.Banded where

import qualified Numeric.LAPACK.Matrix.Array.Private as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Shape.Omni as Omni
import Numeric.LAPACK.Matrix.Array.Private (ArrayMatrix)
import Numeric.LAPACK.Matrix.Shape.Omni (Unit, Arbitrary)
import Numeric.LAPACK.Matrix.Layout.Private (Bands, Packed)
import Numeric.LAPACK.Matrix.Extent.Private (Size, Big)

import qualified Type.Data.Num.Unary.Literal as TypeNum


type FlexBanded prop sub super meas vert horiz height width =
      ArrayMatrix
         Packed prop (Bands sub) (Bands super)
         meas vert horiz height width
type Banded sub super meas vert horiz height width =
      FlexBanded Arbitrary sub super meas vert horiz height width

type General sub super height width =
      Banded sub super Size Big Big height width

type Quadratic prop sub super size =
      ArrMatrix.Quadratic Packed prop (Bands sub) (Bands super) size
type Square sub super size = Quadratic Arbitrary sub super size

type Lower sub size = Square sub TypeNum.U0 size
type Upper super size = Square TypeNum.U0 super size

type UnitTriangular sub super size = Quadratic Unit sub super size
type UnitLower sub size = UnitTriangular sub TypeNum.U0 size
type UnitUpper super size = UnitTriangular TypeNum.U0 super size

type Diagonal size = FlexDiagonal Arbitrary size
type FlexDiagonal diag size = SymmQuadratic diag TypeNum.U0 size

type RectangularDiagonal meas vert horiz height width =
      Banded TypeNum.U0 TypeNum.U0 meas vert horiz height width

type SymmQuadratic prop offDiag sh = Quadratic prop offDiag offDiag sh

type FlexHermitian neg zero pos offDiag sh =
      SymmQuadratic (Omni.Hermitian neg zero pos) offDiag sh
type Hermitian offDiag sh =
      SymmQuadratic Omni.HermitianUnknownDefiniteness offDiag sh
type HermitianPosSemidef offDiag sh =
      SymmQuadratic Omni.HermitianPositiveSemidefinite offDiag sh
type HermitianPosDef offDiag sh =
      SymmQuadratic Omni.HermitianPositiveDefinite offDiag sh