packages feed

uvector-0.1.1.1: examples/smvm/SMVMVect.hs

{-# LANGUAGE PArr #-}
{-# OPTIONS -fvectorise #-}
module SMVMVect (smvm) where

import Data.Array.Parallel.Prelude
import Data.Array.Parallel.Prelude.Double
import Data.Array.Parallel.Prelude.Int (Int)

import qualified Prelude

smvm :: PArray (PArray (Int, Double)) -> PArray Double -> PArray Double
{-# NOINLINE smvm #-}
smvm m v = toPArrayP (smvm' (fromNestedPArrayP m) (fromPArrayP v))

smvm' :: [:[: (Int, Double) :]:] -> [:Double:] -> [:Double:]
smvm' m v = [: sumP [: x * (v !: i) | (i,x) <- row :] | row <- m :]