Graph500-0.4.0: src/G500/Index.hs
-- |
-- Module : G500.Index
-- Copyright : (C) 2013 Parallel Scientific Labs, LLC.
-- License : GPLv2
--
-- Definition for the type of indices.
--
-- I think index type can change over time, so I made that
-- little file with type definition and class that allows one's code
-- to work with different index types.
--
-- On the second thought it looks like overengineering. Let it be.
-- TODO:
-- - type-safe index? (data VertexIndex v = VertexIndex !Index, as an example)
module G500.Index
( Index -- index type.
, RandomIndex(..) -- how to generate random index.
) where
import Data.Bits
import Data.Int
import System.Random
-- |Big enough for Graph500 benchmark purposes.
type Index = Int64
class Bits index => RandomIndex index where
-- |Generate random index.
-- Accepts max value and generator.
-- Returns random index and updated generator.
-- Max value should be power of 2 (valid for Graph500 generator).
randomIndex :: RandomGen g => index -> g -> (index,g)
instance RandomIndex Int64 where
-- simple version.
-- we assume that we get a whole 30 bits of Int in @next@ call.
-- (this is true for StdGen)
randomIndex maxIndex g
| maxIndex < shiftL 1 30 = (fromIntegral low30Bits .&. maxIndex,g')
| otherwise = (fromIntegral low30Bits .|. shiftL highBits 30, g'')
where
(low30Bits,g') = next g
(highBits,g'') = randomIndex (shiftR maxIndex 30) g'