easytensor-0.2.0.0: bench/subspacefolds.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Main (main) where
import Data.Maybe (fromMaybe)
import Data.Time.Clock
import Numeric.DataFrame
import Numeric.Dimensions
type DList = [6,8,10,7,35,8,12] -- [6,26,8,10,35,8,12]
main :: IO ()
main = do
t0 <- getCurrentTime
putStrLn $ "\nStarting benchmarks, current time is " ++ show t0
let df = iwgen @Float @'[] @DList (fromIntegral . fromEnum)
t1 <- df `seq` getCurrentTime
seq t1 putStrLn $ "Created DataFrame, elapsed time is " ++ show (diffUTCTime t1 t0)
putStrLn "\nRunning a ewfoldl on scalar elements..."
let rezEwf = ewfoldl @Float @'[] @DList (\a x -> let z = fromMaybe x a + fromMaybe 0 a / (x+1) in z `seq` return z) (Just 1) df
t2 <- rezEwf `seq` getCurrentTime
print rezEwf
seq t2 putStrLn $ "Done; elapsed time = " ++ show (diffUTCTime t2 t1)
putStrLn "\nRunning a iwfoldl on scalar elements (not using idx)..."
let rezIwf = iwfoldl @Float @'[] @DList (\_ a x -> a + a / (x+1)) 1 df
t3 <- rezIwf `seq` getCurrentTime
print rezIwf
seq t3 putStrLn $ "Done; elapsed time = " ++ show (diffUTCTime t3 t2)
putStrLn "\nRunning a iwfoldr on scalar elements (using fromEnum idx)..."
let rezIwf2 = iwfoldr @Float @'[] @DList (\i x a -> let z = fromMaybe 0 a + x / ((1+) . fromIntegral $ fromEnum i) in z `seq` return z) (Just 0) df
t4 <- rezIwf2 `seq` getCurrentTime
print rezIwf2
seq t4 putStrLn $ "Done; elapsed time = " ++ show (diffUTCTime t4 t3)
putStrLn "\nRunning a iwfoldl on scalar elements (enforcing idx)..."
let rezIwf3 = iwfoldl @Float @'[] @DList (\i a x -> i `seq` let z = fromMaybe 0 a + fromMaybe x a / (x+1) in z `seq` return z) (Just 1) df
t5 <- rezIwf3 `seq` getCurrentTime
print rezIwf3
seq t5 putStrLn $ "Done; elapsed time = " ++ show (diffUTCTime t5 t4)
putStrLn "\nRunning a ewfoldl on vector5 elements..."
let rezEwv1 = ewfoldl @Float @'[Head DList] @(Tail DList)
(\a x -> return $! fromMaybe 2 a + fromMaybe 0 a / (1 + iwgen @_ @'[] (\(i:!Z) -> (i+1):!Z !. x )) )
(Just (3 :: DataFrame Float '[5])) df
t6 <- rezEwv1 `seq` getCurrentTime
print rezEwv1
seq t6 putStrLn $ "Done; elapsed time = " ++ show (diffUTCTime t6 t5)
putStrLn "\nRunning a ewfoldr on vector3 elements..."
let rezEwv2 = ewfoldr @Float @'[Head DList] @(Tail DList)
(\x a -> return $! fromMaybe 2 a + fromMaybe 1 a / (1 + iwgen @_ @'[] (\(i:!Z) -> (i+1):!Z !. x )))
(Just (3 :: DataFrame Float '[3])) df
t7 <- rezEwv2 `seq` getCurrentTime
print rezEwv2
seq t7 putStrLn $ "Done; elapsed time = " ++ show (diffUTCTime t7 t6)
putStrLn "Checking indexes"
print $ 1:!1:!3:!1:!Z !. df