import Test.BenchPress import Test.QuickCheck import Control.Monad import Control.Monad.Random import System.Random(Random) import Data.Array.IArray import Data.RangeMin import Data.Ord(comparing) import Data.List import Debug.Trace import System.Environment import Data.Array.Unboxed import System.IO import System.IO.Unsafe import System.Mem subRangeGen :: (Ix i, MonadRandom m, Random i) => (i, i) -> m (i, i) subRangeGen r = do i <- getRandomR r j <- getRandomR r return (if i > j then (j, i) else (i, j)) vector' n g = replicateM n g validRangeMin :: Int -> UArray Int Int -> [(Int, Int)] -> IO Bool validRangeMin n arr = let rM = rangeMinOpt arr in return . all (\ r -> (rM r < maxBound)) genList :: Int -> IO [Int] genList = flip liftM getRandoms . take genQs :: Int -> Int -> IO [(Int, Int)] genQs n = flip replicateM (subRangeGen (0, n-1)) genData :: Int -> Int -> IO (UArray Int Int, [(Int, Int)]) genData n m = liftM2 (,) (liftM (listArray (0, n-1) :: [Int] -> UArray Int Int) (genList n)) (genQs n m) bencher z n m = trace (show ("Hi", n,m)) $ benchmark z (genData n m) (\_ -> performGC) ((hPutStrLn stderr =<<) . liftM (show ) . (uncurry (validRangeMin n))) main :: IO () main = do (putStrLn =<<) $ liftM (intercalate ",") $ sequence [(liftM (\ x -> "{" ++ show n ++ "," ++ show m ++ "," ++ show x ++ "}") $ liftM (mean.fst) (bencher 5 n m)) | n <- [20000,40000..140000], m <- [5000,7500..15000]] -- let [n, m] = [300, 100] in quickCheck (validRangeMin n m)