packages feed

trie-simple-0.4.2: bench/Common.hs

{-# LANGUAGE NamedFieldPuns #-}
module Common(
  Dataset(..),
  englishDataset, wikiDataset
) where

import qualified Data.Vector as V
import Data.Word

import qualified System.Random.MWC                as R
import qualified System.Random.MWC.CondensedTable as R
import Control.DeepSeq
import Data.List (sort)

data Dataset = Dataset {
    dictA :: [String],
    dictB :: [String],
    dictAUnsorted :: [String],
    gibberish :: [String]
  }
  deriving (Show)

instance NFData Dataset where
  rnf Dataset{ dictA, dictB, dictAUnsorted, gibberish } = rnf dictA `seq` rnf dictB `seq` rnf dictAUnsorted `seq` rnf gibberish

englishDataset :: IO Dataset
englishDataset = do
  dictAmEn <- lines <$> readFile "/usr/share/dict/american-english"
  dictBrEn <- lines <$> readFile "/usr/share/dict/british-english"
  dictAmEnShuffled <- lines <$> readFile "benchdata/american-english-shuf"
  rand <- randomStrs 10003
  pure $ Dataset{ dictA = dictAmEn, dictB = dictBrEn, dictAUnsorted = dictAmEnShuffled, gibberish = rand }

wikiDataset :: IO Dataset
wikiDataset = do
  wiki1 <- lines <$> readFile "benchdata/externallinks.txt.1"
  wiki2 <- lines <$> readFile "benchdata/externallinks.txt.2"
  let wiki1Sorted = sort wiki1
      wiki2Sorted = sort wiki2
  rand <- randomStrs 10007
  pure $ Dataset{ dictA = wiki1Sorted, dictB = wiki2Sorted, dictAUnsorted = wiki1, gibberish = rand }

---

numRandomStr :: Int
numRandomStr = 1000

seed :: Word32 -> V.Vector Word32
seed w = V.fromList [1573289798, 32614861, w]

randomStrs :: Word32 -> IO [String]
randomStrs s =
  do g <- R.initialize (seed s)
     revReplicateM numRandomStr $ do
       n <- R.genFromTable distN g
       revReplicateM (n+1) (uniformAlphabet g)
  where
    distN = R.tableBinomial 12 0.33
    alphabet = V.fromList ['a' .. 'z']
    numAlphabet = V.length alphabet
    uniformAlphabet g = (alphabet V.!) <$> R.uniformR (0, numAlphabet-1) g

revReplicateM :: (Monad m) => Int -> m a -> m [a]
revReplicateM n ma = loop n []
  where
    loop 0 acc = return acc
    loop i acc = ma >>= \a -> loop (i-1) (a:acc)