packages feed

clustering-0.2.0: benchmarks/Bench/Hierarchical.hs

module Bench.Hierarchical
    ( benchHierarchical ) where

import Criterion.Main
import qualified Data.Clustering.Hierarchical as C
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as U
import System.IO.Unsafe (unsafePerformIO)

import AI.Clustering.Hierarchical
import AI.Clustering.Hierarchical.Types

import Bench.Utils

benchHierarchical :: Benchmark
benchHierarchical =
    let dists = computeDists euclidean xs
        fn i j = dists ! (i,j)
        xs = V.fromList $ unsafePerformIO $ randVectors 1000 5
    in bgroup "Hierarchical clustering"
        [ bgroup "AI.Clustering.Hierarchical"
            [ bench "Average Linkage (n = 10)" $
                  whnf (\x -> hclust Average x fn) $! U.enumFromN 0 10
            , bench "Average Linkage (n = 100)" $
                  whnf (\x -> hclust Average x fn) $! U.enumFromN 0 100
            , bench "Average Linkage (n = 500)" $
                  whnf (\x -> hclust Average x fn) $! U.enumFromN 0 500
            ]
        , bgroup "Data.Clustering.Hierarchical"
            [ bench "Average Linkage (n = 10)" $
                  whnf (\x -> C.dendrogram C.UPGMA x fn) $! [0..9]
            , bench "Average Linkage (n = 100)" $
                  whnf (\x -> C.dendrogram C.UPGMA x fn) $! [0..99]
            , bench "Average Linkage (n = 500)" $
                  whnf (\x -> C.dendrogram C.UPGMA x fn) $! [0..499]
            ]

        , bgroup "Distance matrix"
            [ bench "computeDists" $
                  whnf (\x -> computeDists euclidean x) xs
            , bench "computeDists'" $
                  whnf (\x -> computeDists' euclidean x) xs
            ]
        ]