packages feed

tsne-1.2.0: timing/Main.hs

module Main where

import System.Environment(getArgs)
import System.Exit
import Control.Monad(when)
import Data.Default(def)
import Data.Time
import Data.Algorithm.TSNE



main :: IO ()
main = do
    putStrLn "Haskell tSNE Timing"

    args <- getArgs
    let argc = length args
    when (argc < 1 || argc > 2) $ do
        putStrLn "Usage haskell_tsne_timing {input file name} [{num input values}]"
        exitFailure

    let inputFileName = head args
    inputData <- readDataFile inputFileName

    let n = length inputData
    putStrLn $ "total input: " ++ show n

    let n' = if (argc < 2) then n else (read (args !! 1)) 

    putStrLn $ "using: " ++ show n'

    t0 <- getCurrentTime
    forTsne3D (outputResult t0) def $ take n' inputData
    
readDataFile :: FilePath -> IO [[Double]]
readDataFile f = do
    d <- readFile f
    return $ map read (lines d)

outputResult :: UTCTime -> TSNEOutput3D -> IO ()
outputResult t0 s = do
    let i = tsneIteration3D s

    when (i > 0 && (i == 1 || i `mod` 100 == 0)) $ do 
        putStrLn $ "iteration: " ++ show i
        t <- getCurrentTime
        let dt = diffUTCTime t t0
            ms = round $ 1000.0 * realToFrac dt / realToFrac i
        putStrLn $ "  elapsed time: " ++ show dt
        putStrLn $ "  average iteration time: " ++ show ms ++ "ms"