module Data.Matrix.HermBase
where
import Unsafe.Coerce
import BLAS.Internal( checkSquare )
import Data.Matrix.Class
import Data.Tensor.Class
import BLAS.Types ( UpLoEnum(..) )
data Herm a nn e = Herm UpLoEnum (a nn e)
coerceHerm :: Herm a mn e -> Herm a mn' e
coerceHerm = unsafeCoerce
mapHerm :: (a nn e -> b nn' e) -> Herm a nn e -> Herm b nn' e
mapHerm f (Herm u a) = Herm u $ f a
hermFromBase :: UpLoEnum -> a (n,n) e -> Herm a (n,n) e
hermFromBase = Herm
hermToBase :: Herm a (n,n) e -> (UpLoEnum, a (n,n) e)
hermToBase (Herm u a) = (u,a)
hermL :: (MatrixShaped a) => a (n,n) e -> Herm a (n,n) e
hermL a = checkSquare "hermL" (shape a) (Herm Lower a)
hermU :: (MatrixShaped a) => a (n,n) e -> Herm a (n,n) e
hermU a = checkSquare "hermU" (shape a) (Herm Upper a)
instance (MatrixShaped a) => Shaped (Herm a) (Int,Int) where
shape (Herm _ a) = (n,n) where n = min (numRows a) (numCols a)
bounds (Herm _ a) = ((0,0),(n1,n1)) where n = min (numRows a) (numCols a)
instance (MatrixShaped a) => MatrixShaped (Herm a) where
herm = coerceHerm
instance Show (a (n,n) e) => Show (Herm a (n,n) e) where
show (Herm u a) = constructor ++ " (" ++ show a ++ ")"
where
constructor = case u of
Lower -> "hermL"
Upper -> "hermU"