module Data.Matrix.Class.ISolveBase (
ISolve(..),
(<\>),
(<\\>),
ssolve,
ssolveMat,
) where
import Data.Elem.BLAS
import BLAS.Internal ( checkMatVecSolv, checkMatMatSolv )
import Data.Matrix.Class
import Data.Matrix.Class.MSolveBase
import Data.Vector.Dense ( Vector, dim, (*>) )
import Data.Vector.Dense.ST ( runSTVector )
import Data.Matrix.Dense ( Matrix, shape )
import Data.Matrix.Dense.ST ( runSTMatrix )
import Data.Matrix.TriBase
infixr 7 <\>, <\\>
class (MatrixShaped a, BLAS3 e) => ISolve a e where
unsafeSolve :: a (m,n) e -> Vector m e -> Vector n e
unsafeSolve = unsafeSSolve 1
unsafeSolveMat :: a (m,n) e -> Matrix (m,k) e -> Matrix (n,k) e
unsafeSolveMat = unsafeSSolveMat 1
unsafeSSolve :: e -> a (m,n) e -> Vector m e -> Vector n e
unsafeSSolveMat :: e -> a (m,n) e -> Matrix (m,k) e -> Matrix (n,k) e
(<\>) :: (ISolve a e) => a (m,n) e -> Vector m e -> Vector n e
(<\>) a y =
checkMatVecSolv (shape a) (dim y) $
unsafeSolve a y
(<\\>) :: (ISolve a e) => a (m,n) e -> Matrix (m,k) e -> Matrix (n,k) e
(<\\>) a b =
checkMatMatSolv (shape a) (shape b) $
unsafeSolveMat a b
ssolve :: (ISolve a e) => e -> a (m,n) e -> Vector m e -> Vector n e
ssolve alpha a y =
checkMatVecSolv (shape a) (dim y) $
unsafeSSolve alpha a y
ssolveMat :: (ISolve a e) => e -> a (m,n) e -> Matrix (m,k) e -> Matrix (n,k) e
ssolveMat alpha a b =
checkMatMatSolv (shape a) (shape b) $
unsafeSSolveMat alpha a b
instance (BLAS3 e) => ISolve (Tri Matrix) e where
unsafeSSolve alpha a y = runSTVector $ unsafeGetSSolve alpha a y
unsafeSSolveMat alpha a c = runSTMatrix $ unsafeGetSSolveMat alpha a c