dph-examples: take ben's fixed SMVM flow solver from repa-flow
authorAmos Robinson <amos.robinson@gmail.com>
Wed, 14 Nov 2012 04:45:07 +0000 (15:45 +1100)
committerAmos Robinson <amos.robinson@gmail.com>
Wed, 14 Nov 2012 04:45:07 +0000 (15:45 +1100)
dph-examples/examples/spectral/SMVM/dph/Flow.hs
dph-examples/examples/spectral/SMVM/dph/Main.hs

index 48da17c..9d69728 100644 (file)
@@ -2,27 +2,42 @@
 {-# OPTIONS -funfolding-use-threshold1000 #-}
 module Flow (smvm) where
 import Data.Vector.Unboxed
-import Data.Array.Repa.Flow             (Flow)
-import qualified Data.Array.Repa.Flow   as F
-import qualified Data.Vector.Unboxed    as U
+import Data.Array.Repa.Flow.Seq                 (Flow)
+import qualified Data.Array.Repa.Flow.Seq       as F
+import qualified Data.Vector.Unboxed            as U
+
+
+-- {-# NOINLINE smvm #-}
+-- smvm :: Segd U U -> Vector U (Int,Double)
+--     -> Vector U Double
+--     -> IO (Vector U Double)
+
+-- smvm !segd !matrix !vector
+--  = do   let (!ixs,!vals)   = R.unzip matrix
+--        let  !vixs         = I.vindexs ixs vector
+--        let  !vals'        = vzipWith (*) vals vixs
+--        let  !res          = R.sum_s (Segd.splitSegd segd) vals'
+--        return res
+
 
 
--- | Sparse Matrix-Vector multiplication.
 smvm    :: Vector Int           -- ^ Row lengths for matrix.
         -> Vector (Int, Double) -- ^ Sparse matrix column number and coefficient.
         -> Vector Double        -- ^ Dense vector.
-        -> IO (Vector Double)
+        -> Vector Double
 
 smvm !vLens !vMatrix !vVector
- = do   let (vColId, vColVal)   = U.unzip vMatrix
-        fLens           <- F.flow vLens
-        fColId          <- F.flow vColId
-        fColVal         <- F.flow vColVal
-        F.unflow        $  smvm' fLens fColId fColVal vVector
-{-# NOINLINE smvm #-}
+ = let  fLens   = F.flow vLens
+
+        (vColId, vColVal)   = U.unzip vMatrix
+        fColId  = F.flow vColId
+        fColVal = F.flow vColVal
+
+        fVals   = smvm' fLens fColId fColVal vVector
+   in   F.unflow fVals
 
 smvm' fLens fColId fColVal !vVector
-        = F.sums fLens 
-        $ F.zipWith (*) fColVal 
-        $ F.gather vVector fColId
+ = let  fCoeffs     = F.gather vVector fColId 
+        fVals       = F.zipWith (*) fColVal fCoeffs
+   in   F.sums fLens fVals
 {-# INLINE smvm' #-}
index 7cae09a..c00feb2 100644 (file)
@@ -121,7 +121,7 @@ run "flow" reps fileName
         (vResult, tElapsed)
          <- time 
          $  let loop n
-                 = do   !result <- F.smvm vRowLens vMatrix vVector
+                 = do   let !result = F.smvm vRowLens vMatrix vVector
                         if n <= 1
                          then return result
                          else loop (n - 1)