-- -- A k-means clustering implementation. -- Run the generate-samples program first to create some random data. -- module Main where import Kmeans import Config import Data.Array.Accelerate as A import Data.Array.Accelerate.Examples.Internal as A import Control.Applicative import Control.Monad ( unless ) import Data.Binary ( decodeFile ) import Data.Label ( get ) import System.Directory import Prelude as P main :: IO () main = do beginMonitoring (_, opts, rest) <- parseArgs options defaults header footer inputs <- (P.&&) <$> 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 optBackend opts 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 -- runBenchmarks opts rest [ bench "k-means" $ whnf solve initial ]