{-# LANGUAGE TypeFamilies #-}
module Numeric.LAPACK.Matrix.Special (
   Matrix.Matrix(Scale,Inverse), Scale, Inverse, inverse,
   ) where

import qualified Numeric.LAPACK.Matrix.Inverse as Inverse
import qualified Numeric.LAPACK.Matrix.Type.Private as Matrix
import qualified Numeric.LAPACK.Matrix.Shape.Omni as Omni
import Numeric.LAPACK.Matrix.Layout.Private (Empty, Filled)


type Scale sh = Matrix.Quadratic Matrix.Scale () () Empty Empty sh
type Inverse typ lower upper sh =
      Matrix.Quadratic (Inverse.Inverse typ) lower upper Filled Filled sh

inverse ::
   (Omni.PowerStrip lower, Omni.PowerStrip upper) =>
   Matrix.QuadraticMeas typ xl xu upper lower meas width height a ->
   Matrix.QuadraticMeas (Inverse.Inverse typ) (xl,lower) (xu,upper)
      lower upper meas height width a
inverse :: forall lower upper typ xl xu meas width height a.
(PowerStrip lower, PowerStrip upper) =>
QuadraticMeas typ xl xu upper lower meas width height a
-> QuadraticMeas
     (Inverse typ)
     (xl, lower)
     (xu, upper)
     lower
     upper
     meas
     height
     width
     a
inverse QuadraticMeas typ xl xu upper lower meas width height a
a = QuadraticMeas typ xl xu upper lower meas width height a
-> Matrix
     (Inverse typ)
     (xl, lower)
     (xu, upper)
     lower
     upper
     meas
     Small
     Small
     height
     width
     a
forall typ xl xu upperf lowerf meas width height a.
QuadraticMeas typ xl xu upperf lowerf meas width height a
-> Matrix
     (Inverse typ)
     (xl, lowerf)
     (xu, upperf)
     lowerf
     upperf
     meas
     Small
     Small
     height
     width
     a
Inverse.Inverse QuadraticMeas typ xl xu upper lower meas width height a
a