import Test.BenchPress import Test.QuickCheck import Control.Monad import Control.Monad.Random import System.Random(Random) import Data.Array.IArray import Data.RangeMin(rangeMin') import Data.Ord(comparing) import Data.List import Debug.Trace import System.Environment 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 -> [Int] -> [(Int, Int)] -> IO Bool validRangeMin n list = let rM = rangeMin' (0, n-1) list in return . all (\ r -> (snd (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 ([Int], [(Int, Int)]) genData n m = liftM2 (,) (genList n) (genQs n m) bencher z n m = trace (show (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 (median.fst) (bencher 5 n m)) | n <- [5000,10000..50000], m <- [1000,3000..15000]] -- let [n, m] = [300, 100] in quickCheck (validRangeMin n m)