import Control.Monad import Control.Arrow (first, second) import Control.Applicative import Data.Vector.DynamicTimeWarping import Data.Vector.Unboxed (fromList, Vector, postscanl) import System.Random import Text.Printf import Criterion import Criterion.Main genSeq :: Int -> IO (Int, Vector (Float, Float)) genSeq n = do let genTuple = (,) <$> randomRIO (0,100) <*> randomRIO (0,100) (,) n <$> postscanl (\(x,y) (z,w) -> (x+z,y+w)) (0,0) . fromList <$> replicateM n genTuple genSeqs (l, r) = do left <- genSeq l right <- genSeq r return (left, right) setupEnv = do let sizes = [(l, r) | l <- [5,10,100, 1000, 10000], r <- [5,10,100, 1000, 10000], l <= r] :: [(Int, Int)] mapM genSeqs sizes dist (l, r) = distanceBy (\(x1,x2) (y1,y2) -> (x1-y1)^2 + (x2-y2)^2) l r main = defaultMain [ env setupEnv $ \ ~l -> bgroup "dtw" [ bench (printf "dtw(%03d, %03d)" l r) $ nf dist (ll,rr) | ((l, ll), (r, rr)) <- l ] ]