-- | -- Copyright : (C) 2013 Parallel Scientific Labs, LLC. -- License : GPLv2 -- -- Testing GraphHammer analyses. {-# LANGUAGE PatternGuards #-} module Main(main) where import Control.Monad import Control.Monad.State import Data.Array import Data.Array.IO import Data.Array.Unboxed import Data.Bits import Data.IORef import Data.List import Data.Word import System.Environment import System.Exit import System.IO import qualified G500 as G500 import qualified G500.Read as GR import GraphHammer import GraphHammer.TriangleCount import RectangleGraphGenerator import OneToOneGraphGenerator ------------------------------------------------------------------------------- -- Configuration parameters. ------------------------------------------------------------------------------- -- Generating test data. testDataReading :: String -> Int -> IO (Integer, (IO (Maybe (UArray Int Index)))) testDataReading fname batchSize = do h <- openBinaryFile fname ReadMode nEdges <- computeEdgesCount h gen <- GR.mkGraph500Reader h batchSize return (computeBatchThreshold nEdges, gen) where -- !!!HACKHACK!!! -- it thinks we always will use Int64 for vertex index. computeEdgesCount handle = do sz <- hFileSize handle return $ sz `div` (8*2) computeBatchThreshold nEdges = threshold - threshold `mod` fromIntegral batchSize where threshold = nEdges - 80000 ------------------------------------------------------------------------------- -- Reading the arguments. data GHammerArgs = GArgs { saBatchSize :: Int , saNodes :: Int , saProcesses :: Int } readArguments :: IO (String, GHammerArgs) readArguments = do args <- getArgs putStrLn $ "Arguments: "++show args case runStateT parseArgs args of Nothing -> do putStrLn $ unlines [ "usage: TriangleCountTest -fname= [gHammer arguments]" , "gHammer arguments are:" , " -batch=, default 1000" , " -nodes=, default 1" , " -processes=, default 1" , "As gHammer arguments all have defaults, they can be omitted." , "Default values will make GraphHammer work sequentially." ] exitFailure Just (result,_) -> return result where matchOpt :: String -> StateT [String] Maybe (Maybe String) matchOpt opt = do (('-':a):as) <- get put as mplus (do "" <- lift $ stripPrefix opt a return Nothing) (liftM Just (lift $ stripPrefix (opt++"=") a)) intOpt opt = do Just v <- matchOpt opt case reads v of [(i,"")] -> return i _ -> mzero intDefOpt def opt = intOpt opt `mplus` return def speedMeasurementArgs = do sa <- gHammerArgs [] <- get return sa filenameOpt = do Just fn <- matchOpt "fname" return fn parseArgs = do liftM2 (,) filenameOpt speedMeasurementArgs gHammerArgs = do parseOpts $ GArgs 1000 1 1 where parseOpts sa = do sa' <- batch sa `mplus` nodes sa `mplus` processes sa parseOpts sa' `mplus` return sa batch sa = do b <- intOpt "batch" return $ sa { saBatchSize = b } nodes sa = do n <- intOpt "nodes" return $ sa { saNodes = n } processes sa = do p <- intOpt "processes" return $ sa { saProcesses = p } ------------------------------------------------------------------------------- -- Running the test. main = do (fn, gHammerArgs) <- readArguments (threshold, gen) <- testDataReading fn (saBatchSize gHammerArgs) let maxNodes = saNodes gHammerArgs runAnalysesStack threshold maxNodes gen triangleCount