fpnla-examples-0.1: src/FPNLA/Matrix/Instances/HMatrix.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverlappingInstances #-}
module FPNLA.Matrix.Instances.HMatrix () where
import Control.DeepSeq (NFData (rnf))
import Control.Parallel.Strategies (rseq, withStrategy)
import qualified Data.Packed.Matrix as HM (Element, Matrix,
buildMatrix, cols,
fromBlocks, fromColumns,
mapMatrix, rows, subMatrix,
toBlocksEvery, toColumns,
toRows, trans, (><), (@@>))
import qualified Data.Packed.Vector as HV (Vector, buildVector, dim,
foldVector, fromList, join,
mapVector, zipVectorWith,
(@>))
import FPNLA.Matrix (Matrix (generate_m, fromList_m, transpose_m, dim_m, elem_m, subMatrix_m, fromBlocks_m, toBlocks_m, map_m), MatrixVector (fromCols_vm, toCols_vm, row_vm, col_vm), Vector (generate_v, fromList_v, concat_v, elem_v, length_v, foldr_v, map_v, zipWith_v))
{-
instance (NFData e) => NFData (HV.Vector e) where
-- Asumo que Vector es estricto
-- http://haskell.1045720.n5.nabble.com/NFData-instance-for-Numeric-LinearAlgebra-Matrix-td4265725.html
rnf v = (withStrategy rseq v) `seq` ()
-}
instance (NFData e) => NFData (HM.Matrix e) where
-- Matrix es estricto
-- http://haskell.1045720.n5.nabble.com/NFData-instance-for-Numeric-LinearAlgebra-Matrix-td4265725.html
rnf m = withStrategy rseq m `seq` ()
instance (HM.Element e) => Vector HV.Vector e where
generate_v = HV.buildVector
fromList_v = HV.fromList
concat_v = HV.join
elem_v pos v = v HV.@> pos
length_v = HV.dim
foldr_v = HV.foldVector
map_v = HV.mapVector
zipWith_v = HV.zipVectorWith
instance (HM.Element e) => Matrix HM.Matrix e where
generate_m rows cols gen = HM.buildMatrix rows cols (uncurry gen)
fromList_m = (HM.><)
transpose_m = HM.trans
dim_m m = (HM.rows m, HM.cols m)
elem_m i j m = m HM.@@> (i, j)
map_m = HM.mapMatrix
--zipWith_m
subMatrix_m posI posJ cantRows cantCols = HM.subMatrix (posI, posJ) (cantRows, cantCols)
fromBlocks_m = HM.fromBlocks
toBlocks_m = HM.toBlocksEvery
instance (HM.Element e) => MatrixVector HM.Matrix HV.Vector e where
row_vm pos m = HM.toRows m !! pos
col_vm pos m = HM.toColumns m !! pos
fromCols_vm = HM.fromColumns
toCols_vm = HM.toColumns