{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Criterion.Main
import Foreign hiding ((.&.))
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.EliasFano
import HaskellWorks.Data.FromForeignRegion
import System.Environment
import System.IO.MMap
import qualified Data.ByteString as BS
import qualified Data.ByteString.Internal as BSI
import qualified Data.Vector.Storable as DVS
getPositions :: DVS.Vector Word64 -> [Word64]
getPositions v = DVS.ifoldl go id v []
where go :: ([Word64] -> [Word64]) -> Int -> Word64 -> [Word64] -> [Word64]
go ws i w = ws . goWord64 id 0 (fromIntegral i * 64) w
goWord64 :: ([Word64] -> [Word64]) -> Word64 -> Word64 -> Word64 -> [Word64] -> [Word64]
goWord64 ws i b w | i < 64 = if (w .&. 1) /= 0 then (b + i:) . goWord64 ws (i + 1) b (w .>. 1) else goWord64 ws (i + 1) b (w .>. 1)
goWord64 ws _ _ _ = ws
encode :: FilePath -> IO ()
encode filename = do
!ibFr <- mmapFileForeignPtr filename ReadOnly Nothing
let !ib = fromForeignRegion ibFr :: DVS.Vector Word64
let !positions = getPositions ib
let !_ = fromWord64s positions :: EliasFano
return ()
loadBitString :: FilePath -> IO BS.ByteString
loadBitString filepath = do
(fptr :: ForeignPtr Word8, offset, sz) <- mmapFileForeignPtr filepath ReadOnly Nothing
let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset sz
return bs
benchEliasFano :: [Benchmark]
benchEliasFano =
[ bgroup "Load Elias Fano"
[ bench "Load Elias Fano" (whnfIO (encode "larger.ib"))
]
]
main :: IO ()
main = do
args <- getArgs
case args of
(filename:_) -> encode filename
_ -> defaultMain benchEliasFano
putStrLn $ "Arguments: " <> show args