packages feed

stc-lang-1.0.0: test/FakeComputation.hs

module FakeComputation where

-- | Original source https://github.com/iu-parfunc/lvars/tree/master/archived_old/fhpc13-lvars/benchmarks
import Control.DeepSeq
import Control.Monad.State

import Control.Concurrent (myThreadId)

-- Iterates the sin function n times on its input and returns the sum
-- of all iterations.
sin_iter :: Int -> Float -> Float
sin_iter 0 x = x
sin_iter n !x = sin_iter (n - 1) (x + sin x)

cos_iter :: Int -> Float -> Float
cos_iter 0 x = x
cos_iter n !x = cos_iter (n - 1) (x + cos x)

tan_iter :: Int -> Float -> Float
tan_iter 0 x = x
tan_iter n !x = tan_iter (n - 1) (x + tan x)

wrk_sins :: Int -> Float -> Float
wrk_sins num sin_wrk =
    let res = sin_iter num (2.222 + sin_wrk)
     in force res

gwrk :: Int -> Float -> (Int -> Float -> Float) -> Float
gwrk num wrk f =
    let res = f num (2.222 + wrk)
     in force res

type ID = Int

work :: Float -> StateT (ID, Int) IO (Float, Float)
work wrk
  -- liftIO $ putStrLn $ "work: " ++ (show wrk)
 = do
    (identifier, numIter) <- get
    tId <- liftIO myThreadId
  -- liftIO $ putStrLn $ "start: " ++ (show identifier) ++ " on thread: " ++ (show tId)
  -- let r = wrk_sins numIter wrk
    let r = sin_iter numIter (2.222 + wrk)
  -- r <- liftIO $ evaluate $ force $ sin_iter numIter (2.222 + wrk) -- this is the solution!
  -- liftIO $ putStrLn $ "stop: " ++ (show identifier)
  -- liftIO $ putStrLn $ "result: " ++ (show r)
    return (wrk, r)

gwork :: (Int -> Float -> Float) -> Float -> StateT (ID, Int) IO (Float, Float)
gwork f wrk
  -- liftIO $ putStrLn $ "work: " ++ (show wrk)
 = do
    (identifier, numIter) <- get
    tId <- liftIO myThreadId
  -- liftIO $ putStrLn $ "start: " ++ (show identifier) ++ " on thread: " ++ (show tId)
    let r = gwrk numIter wrk f
  -- r <- liftIO $ evaluate $ force $ f numIter (2.222 + wrk) -- this is the solution!
  -- liftIO $ putStrLn $ "stop: " ++ (show identifier)
  -- liftIO $ putStrLn $ "result: " ++ (show r)
    return (wrk, r)