packages feed

fpnla-examples-0.1: src/FPNLA/Operations/LAPACK/Strategies/POTRF/HMatrixBindSeq.hs

{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables   #-}

module FPNLA.Operations.LAPACK.Strategies.POTRF.HMatrixBindSeq (

) where

import qualified Data.Packed.Matrix                           as HM
import           FPNLA.Matrix                                 (MatrixVector,
                                                               cantCols_m,
                                                               cantRows_m,
                                                               elem_m,
                                                               generate_m,
                                                               transpose_m)
import           FPNLA.Operations.LAPACK                      (POTRF (potrf))
import           FPNLA.Operations.LAPACK.Strategies.DataTypes (HMatrixBindSeq)
import           FPNLA.Operations.Parameters                  (Elt, blasResultM,
                                                               unTriangT)
import           Numeric.LinearAlgebra.Algorithms

instance (Field e, Elt e, MatrixVector m v e) => POTRF HMatrixBindSeq m v e where
    potrf _ pmA = blasResultM . fromHMatrix . chol . toHMatrix $ mA
        where mA = snd $ unTriangT pmA
              fromHMatrix m = transpose_m $ generate_m (HM.rows m) (HM.cols m) (\i j -> m HM.@@> (i, j))
              toHMatrix m = HM.buildMatrix (cantRows_m m) (cantCols_m m) (\(i, j)-> elem_m i j m)