-- -- A k-means clustering implementation. -- Run the generate-samples program first to create some random data. -- module Main where import Kmeans import Config import Monitoring import ParseArgs import Prelude as P import Data.Array.Accelerate as A import Control.Applicative ( (<$>), (<*>) ) import Control.Monad ( unless ) import Criterion.Main ( defaultMainWith, bench, whnf ) import Data.Binary ( decodeFile ) import Data.Label ( get ) import System.Directory import System.Environment main :: IO () main = do beginMonitoring argv <- getArgs (conf, cconf, nops) <- parseArgs configHelp configBackend options defaults header footer argv inputs <- (&&) <$> doesFileExist "points.bin" <*> doesFileExist "clusters" unless inputs $ do error "Run the GenSamples program first to generate random data" points' <- decodeFile "points.bin" initial' <- read `fmap` readFile "clusters" let nclusters = P.length initial' npoints = P.length points' solve = run1 backend (kmeans (use points)) backend = get configBackend conf initial :: Vector (Cluster Float) initial = A.fromList (Z:.nclusters) initial' points :: Vector (Point Float) points = A.fromList (Z:.npoints) points' -- Warm up first by printing the expected results -- putStrLn $ "number of points: " P.++ show npoints putStrLn $ "final clusters:\n" P.++ unlines (P.map show . A.toList $ solve initial) -- Now benchmark -- withArgs nops $ defaultMainWith cconf (return ()) [ bench "k-means" $ whnf solve initial ]