fpnla-examples-0.1: src/FPNLA/Matrix/Instances/VectorMatrix.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverlappingInstances #-}
module FPNLA.Matrix.Instances.VectorMatrix (
VVector,
VMatrix(VMatrix),
) where
import Control.DeepSeq (NFData, rnf)
import Control.Parallel.Strategies (rdeepseq, withStrategy)
import qualified Data.Foldable (foldr)
import qualified Data.Vector as DV (Vector, concat, drop,
fromList, generate, head,
length, map, take, toList,
zipWith, (!), (++))
import FPNLA.Matrix (Matrix (..), MatrixVector (..),
Vector (..), cantCols_m)
import FPNLA.Utils (iif)
{-
instance (NFData a) => NFData (DV.Vector a) where
rnf v = evalVect (DV.length v)
where evalVect i
| i > 0 = withStrategy rdeepseq (v DV.! (i-1)) `seq` evalVect (i-1)
| otherwise = ()
-}
instance (NFData a) => NFData (VMatrix a) where
rnf (VMatrix v) = withStrategy rdeepseq v `seq` ()
--
type VVector = DV.Vector
instance Vector (DV.Vector) e where
generate_v = DV.generate
fromList_v = DV.fromList
concat_v = DV.concat
elem_v = flip (DV.!)
length_v = DV.length
foldr_v = Data.Foldable.foldr
map_v = DV.map
zipWith_v = DV.zipWith
--
newtype VMatrix e = VMatrix (DV.Vector (DV.Vector e)) deriving (Show)
wrapIn :: DV.Vector (DV.Vector e) -> VMatrix e
wrapIn = VMatrix
wrapOut :: VMatrix e -> DV.Vector (DV.Vector e)
wrapOut (VMatrix vv) = vv
instance Matrix VMatrix e where
generate_m cr cc gen = wrapIn $ DV.generate cc (\j -> DV.generate cr (`gen` j))
--fromList_m =
--transpose_m =
-- Se guarda por columnas!
dim_m m = (iif (cc > 0) cr 0, cc)
where cc = DV.length (wrapOut m)
cr = DV.length $ DV.head (wrapOut m)
elem_m i j m = wrapOut m DV.! j DV.! i
map_m f m = wrapIn $ DV.map (DV.map f) (wrapOut m)
zipWith_m f m1 m2 = wrapIn $ DV.zipWith (DV.zipWith f) (wrapOut m1) (wrapOut m2)
subMatrix_m posI posJ cantRows cantCols =
wrapIn . DV.map (DV.take cantRows . DV.drop posI) . DV.take cantCols . DV.drop posJ . wrapOut
fromBlocks_m = expandVert . map expandHoriz
where
expandVert lm = wrapIn . DV.generate (cantCols_m (head lm)) $ (\c -> foldr1 (DV.++) $ map (col_vm c) lm)
expandHoriz = wrapIn . foldr1 (DV.++) . map wrapOut
--toBlocks_m
instance MatrixVector VMatrix DV.Vector e where
row_vm i m = DV.map (DV.! i) (wrapOut m)
col_vm j m = wrapOut m DV.! j
fromCols_vm = wrapIn . DV.fromList
toCols_vm = DV.toList . wrapOut