diff -Nru haskell-criterion-0.5.0.10/Criterion/Analysis/Types.hs haskell-criterion-0.6.0.1/Criterion/Analysis/Types.hs --- haskell-criterion-0.5.0.10/Criterion/Analysis/Types.hs 1970-01-01 00:00:00.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/Analysis/Types.hs 2012-01-21 22:32:16.000000000 +0000 @@ -0,0 +1,88 @@ +{-# LANGUAGE DeriveDataTypeable, OverloadedStrings, RecordWildCards #-} +-- | +-- Module : Criterion.Analysis.Types +-- Copyright : (c) 2011 Bryan O'Sullivan +-- +-- License : BSD-style +-- Maintainer : bos@serpentine.com +-- Stability : experimental +-- Portability : GHC +-- +-- Analysis types. + +module Criterion.Analysis.Types + ( + Outliers (..) + , OutlierEffect(..) + , OutlierVariance(..) + , SampleAnalysis(..) + ) where + +import Control.DeepSeq (NFData(rnf)) +import Data.Data (Data) +import Data.Int (Int64) +import Data.Monoid (Monoid(..)) +import Data.Typeable (Typeable) +import qualified Statistics.Resampling.Bootstrap as B + +-- | Outliers from sample data, calculated using the boxplot +-- technique. +data Outliers = Outliers { + samplesSeen :: {-# UNPACK #-} !Int64 + , lowSevere :: {-# UNPACK #-} !Int64 + -- ^ More than 3 times the interquartile range (IQR) below the + -- first quartile. + , lowMild :: {-# UNPACK #-} !Int64 + -- ^ Between 1.5 and 3 times the IQR below the first quartile. + , highMild :: {-# UNPACK #-} !Int64 + -- ^ Between 1.5 and 3 times the IQR above the third quartile. + , highSevere :: {-# UNPACK #-} !Int64 + -- ^ More than 3 times the IQR above the third quartile. + } deriving (Eq, Read, Show, Typeable, Data) + +instance NFData Outliers + +-- | A description of the extent to which outliers in the sample data +-- affect the sample mean and standard deviation. +data OutlierEffect = Unaffected -- ^ Less than 1% effect. + | Slight -- ^ Between 1% and 10%. + | Moderate -- ^ Between 10% and 50%. + | Severe -- ^ Above 50% (i.e. measurements + -- are useless). + deriving (Eq, Ord, Read, Show, Typeable, Data) + +instance NFData OutlierEffect + +instance Monoid Outliers where + mempty = Outliers 0 0 0 0 0 + mappend = addOutliers + +addOutliers :: Outliers -> Outliers -> Outliers +addOutliers (Outliers s a b c d) (Outliers t w x y z) = + Outliers (s+t) (a+w) (b+x) (c+y) (d+z) +{-# INLINE addOutliers #-} + +-- | Analysis of the extent to which outliers in a sample affect its +-- standard deviation (and to some extent, its mean). +data OutlierVariance = OutlierVariance { + ovEffect :: OutlierEffect + -- ^ Qualitative description of effect. + , ovDesc :: String + -- ^ Brief textual description of effect. + , ovFraction :: Double + -- ^ Quantitative description of effect (a fraction between 0 and 1). + } deriving (Eq, Read, Show, Typeable, Data) + +instance NFData OutlierVariance where + rnf OutlierVariance{..} = rnf ovEffect `seq` rnf ovDesc `seq` rnf ovFraction + +-- | Result of a bootstrap analysis of a non-parametric sample. +data SampleAnalysis = SampleAnalysis { + anMean :: B.Estimate + , anStdDev :: B.Estimate + , anOutlierVar :: OutlierVariance + } deriving (Eq, Show, Typeable, Data) + +instance NFData SampleAnalysis where + rnf SampleAnalysis{..} = + rnf anMean `seq` rnf anStdDev `seq` rnf anOutlierVar diff -Nru haskell-criterion-0.5.0.10/Criterion/Analysis.hs haskell-criterion-0.6.0.1/Criterion/Analysis.hs --- haskell-criterion-0.5.0.10/Criterion/Analysis.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/Analysis.hs 2012-01-21 22:32:16.000000000 +0000 @@ -1,6 +1,7 @@ +{-# LANGUAGE DeriveDataTypeable, RecordWildCards, UnboxedTuples #-} -- | -- Module : Criterion.Analysis --- Copyright : (c) 2009, 2010 Bryan O'Sullivan +-- Copyright : (c) 2009, 2010, 2011 Bryan O'Sullivan -- -- License : BSD-style -- Maintainer : bos@serpentine.com @@ -12,7 +13,11 @@ module Criterion.Analysis ( Outliers (..) + , OutlierEffect(..) , OutlierVariance(..) + , SampleAnalysis(..) + , analyseSample + , scale , analyseMean , countOutliers , classifyOutliers @@ -21,49 +26,20 @@ ) where import Control.Monad (when) +import Criterion.Analysis.Types import Criterion.IO (note) import Criterion.Measurement (secs) import Criterion.Monad (Criterion) -import qualified Data.Vector.Unboxed as U import Data.Int (Int64) import Data.Monoid (Monoid(..)) import Statistics.Function (sort) import Statistics.Quantile (weightedAvg) -import Statistics.Resampling.Bootstrap (Estimate(..)) -import Statistics.Sample (mean) +import Statistics.Resampling (Resample, resample) +import Statistics.Sample (mean, stdDev) import Statistics.Types (Sample) - --- | Outliers from sample data, calculated using the boxplot --- technique. -data Outliers = Outliers { - samplesSeen :: {-# UNPACK #-} !Int64 - , lowSevere :: {-# UNPACK #-} !Int64 - -- ^ More than 3 times the IQR below the first quartile. - , lowMild :: {-# UNPACK #-} !Int64 - -- ^ Between 1.5 and 3 times the IQR below the first quartile. - , highMild :: {-# UNPACK #-} !Int64 - -- ^ Between 1.5 and 3 times the IQR above the third quartile. - , highSevere :: {-# UNPACK #-} !Int64 - -- ^ More than 3 times the IQR above the third quartile. - } deriving (Eq, Read, Show) - --- | A description of the extent to which outliers in the sample data --- affect the sample mean and standard deviation. -data OutlierVariance = Unaffected -- ^ Less than 1% effect. - | Slight -- ^ Between 1% and 10%. - | Moderate -- ^ Between 10% and 50%. - | Severe -- ^ Above 50% (i.e. measurements - -- are useless). - deriving (Eq, Ord, Show) - -instance Monoid Outliers where - mempty = Outliers 0 0 0 0 0 - mappend = addOutliers - -addOutliers :: Outliers -> Outliers -> Outliers -addOutliers (Outliers s a b c d) (Outliers t w x y z) = - Outliers (s+t) (a+w) (b+x) (c+y) (d+z) -{-# INLINE addOutliers #-} +import System.Random.MWC (withSystemRandom) +import qualified Data.Vector.Unboxed as U +import qualified Statistics.Resampling.Bootstrap as B -- | Classify outliers in a data set, using the boxplot technique. classifyOutliers :: Sample -> Outliers @@ -87,21 +63,21 @@ -- | Compute the extent to which outliers in the sample data affect -- the sample mean and standard deviation. -outlierVariance :: Estimate -- ^ Bootstrap estimate of sample mean. - -> Estimate -- ^ Bootstrap estimate of sample - -- standard deviation. - -> Double -- ^ Number of original iterations. - -> (OutlierVariance, Double) -outlierVariance µ σ a = (effect, varOutMin) +outlierVariance :: B.Estimate -- ^ Bootstrap estimate of sample mean. + -> B.Estimate -- ^ Bootstrap estimate of sample + -- standard deviation. + -> Double -- ^ Number of original iterations. + -> OutlierVariance +outlierVariance µ σ a = OutlierVariance effect desc varOutMin where - effect | varOutMin < 0.01 = Unaffected - | varOutMin < 0.1 = Slight - | varOutMin < 0.5 = Moderate - | otherwise = Severe + (# effect, desc #) | varOutMin < 0.01 = (# Unaffected, "no" #) + | varOutMin < 0.1 = (# Slight, "slight" #) + | varOutMin < 0.5 = (# Moderate, "moderate" #) + | otherwise = (# Severe, "severe" #) varOutMin = (minBy varOut 1 (minBy cMax 0 µgMin)) / σb2 varOut c = (ac / a) * (σb2 - ac * σg2) where ac = a - c - σb = estPoint σ - µa = estPoint µ / a + σb = B.estPoint σ + µa = B.estPoint µ / a µgMin = µa / 2 σg = min (µgMin / 4) (σb / sqrt a) σg2 = σg * σg @@ -112,7 +88,7 @@ k1 = σb2 - a * σg2 + ad k0 = -a * ad ad = a * d - d = k * 2 where k = µa - x + d = k * k where k = µa - x det = k1 * k1 - 4 * σg2 * k0 -- | Count the total number of outliers in a sample. @@ -132,6 +108,33 @@ noteOutliers . classifyOutliers $ a return µ +-- | Multiply the 'Estimate's in an analysis by the given value, using +-- 'B.scale'. +scale :: Double -- ^ Value to multiply by. + -> SampleAnalysis -> SampleAnalysis +scale f s@SampleAnalysis{..} = s { + anMean = B.scale f anMean + , anStdDev = B.scale f anStdDev + } + +-- | Perform a bootstrap analysis of a non-parametric sample. +analyseSample :: Double -- ^ Confidence interval (between 0 and 1). + -> Sample -- ^ Sample data. + -> Int -- ^ Number of resamples to perform + -- when bootstrapping. + -> IO SampleAnalysis +analyseSample ci samples numResamples = do + let ests = [mean,stdDev] + resamples <- withSystemRandom $ \gen -> + resample gen ests numResamples samples :: IO [Resample] + let [estMean,estStdDev] = B.bootstrapBCA ci samples ests resamples + ov = outlierVariance estMean estStdDev (fromIntegral $ U.length samples) + return SampleAnalysis { + anMean = estMean + , anStdDev = estStdDev + , anOutlierVar = ov + } + -- | Display a report of the 'Outliers' present in a 'Sample'. noteOutliers :: Outliers -> Criterion () noteOutliers o = do diff -Nru haskell-criterion-0.5.0.10/Criterion/Config.hs haskell-criterion-0.6.0.1/Criterion/Config.hs --- haskell-criterion-0.5.0.10/Criterion/Config.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/Config.hs 2012-01-21 22:32:16.000000000 +0000 @@ -1,4 +1,4 @@ -{-# LANGUAGE CPP, DeriveDataTypeable #-} +{-# LANGUAGE DeriveDataTypeable #-} -- | -- Module : Criterion.Config @@ -14,8 +14,6 @@ module Criterion.Config ( Config(..) - , PlotOutput(..) - , Plot(..) , PrintExit(..) , Verbosity(..) , defaultConfig @@ -23,7 +21,7 @@ , ljust ) where -import Criterion.MultiMap (MultiMap) +import Data.Data (Data) import Data.Function (on) import Data.Monoid (Monoid(..), Last(..)) import Data.Typeable (Typeable) @@ -39,37 +37,23 @@ | List -- ^ Print a list of known benchmarks. | Version -- ^ Print version information (if known). | Help -- ^ Print a help\/usaage message. - deriving (Eq, Ord, Bounded, Enum, Read, Show, Typeable) + deriving (Eq, Ord, Bounded, Enum, Read, Show, Typeable, Data) instance Monoid PrintExit where mempty = Nada mappend = max --- | Supported plot outputs. Some outputs support width and height in --- varying units. A point is 1\/72 of an inch (0.353mm). -data PlotOutput = CSV -- ^ Textual CSV file. - | PDF Int Int -- ^ PDF file, dimensions in points. - | PNG Int Int -- ^ PNG file, dimensions in pixels. - | SVG Int Int -- ^ SVG file, dimensions in points. - | Window Int Int-- ^ Display in a window, dimensions in pixels. - deriving (Eq, Ord, Read, Show, Typeable) - --- | What to plot. -data Plot = KernelDensity -- ^ Kernel density estimate of probabilities. - | Timing -- ^ Benchmark timings. - deriving (Eq, Ord, Read, Show, Typeable) - -- | Top-level program configuration. data Config = Config { cfgBanner :: Last String -- ^ The \"version\" banner to print. , cfgConfInterval :: Last Double -- ^ Confidence interval to use. , cfgPerformGC :: Last Bool -- ^ Whether to run the GC between passes. - , cfgPlot :: MultiMap Plot PlotOutput -- ^ What to plot, and where. - , cfgPlotSameAxis :: Last Bool , cfgPrintExit :: PrintExit -- ^ Whether to print information and exit. , cfgResamples :: Last Int -- ^ Number of resamples to perform. + , cfgReport :: Last FilePath -- ^ Filename of report. , cfgSamples :: Last Int -- ^ Number of samples to collect. - , cfgSummaryFile :: Last FilePath -- ^ Filename of summary CSV + , cfgSummaryFile :: Last FilePath -- ^ Filename of summary CSV. + , cfgTemplate :: Last FilePath -- ^ Filename of report template. , cfgVerbosity :: Last Verbosity -- ^ Whether to run verbosely. } deriving (Eq, Read, Show, Typeable) @@ -83,12 +67,12 @@ cfgBanner = ljust "I don't know what version I am." , cfgConfInterval = ljust 0.95 , cfgPerformGC = ljust False - , cfgPlot = mempty - , cfgPlotSameAxis = ljust False , cfgPrintExit = Nada , cfgResamples = ljust (100 * 1000) + , cfgReport = mempty , cfgSamples = ljust 100 , cfgSummaryFile = mempty + , cfgTemplate = ljust "report.tpl" , cfgVerbosity = ljust Normal } @@ -109,12 +93,12 @@ cfgBanner = mempty , cfgConfInterval = mempty , cfgPerformGC = mempty - , cfgPlot = mempty - , cfgPlotSameAxis = mempty , cfgPrintExit = mempty + , cfgReport = mempty , cfgResamples = mempty , cfgSamples = mempty , cfgSummaryFile = mempty + , cfgTemplate = mempty , cfgVerbosity = mempty } @@ -124,12 +108,12 @@ cfgBanner = app cfgBanner a b , cfgConfInterval = app cfgConfInterval a b , cfgPerformGC = app cfgPerformGC a b - , cfgPlot = app cfgPlot a b - , cfgPlotSameAxis = app cfgPlotSameAxis a b , cfgPrintExit = app cfgPrintExit a b + , cfgReport = app cfgReport a b + , cfgResamples = app cfgResamples a b , cfgSamples = app cfgSamples a b , cfgSummaryFile = app cfgSummaryFile a b - , cfgResamples = app cfgResamples a b + , cfgTemplate = app cfgTemplate a b , cfgVerbosity = app cfgVerbosity a b } where app f = mappend `on` f diff -Nru haskell-criterion-0.5.0.10/Criterion/Environment.hs haskell-criterion-0.6.0.1/Criterion/Environment.hs --- haskell-criterion-0.5.0.10/Criterion/Environment.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/Environment.hs 2012-01-21 22:32:16.000000000 +0000 @@ -25,7 +25,6 @@ import Criterion.Monad (Criterion) import qualified Data.Vector.Unboxed as U import Data.Typeable (Typeable) -import Statistics.Function (create) -- | Measured aspects of the execution environment. data Environment = Environment { @@ -51,13 +50,13 @@ } where resolution k = do - times <- create (k+1) (const getTime) + times <- U.replicateM (k+1) getTime return (U.tail . U.filter (>=0) . U.zipWith (-) (U.tail times) $ times, U.length times) cost timeLimit = liftIO $ do let timeClock k = time_ (replicateM_ k getTime) _ <- timeClock 1 (_, iters, elapsed) <- runForAtLeast 0.01 10000 timeClock - times <- create (ceiling (timeLimit / elapsed)) $ \_ -> timeClock iters + times <- U.replicateM (ceiling (timeLimit / elapsed)) $ timeClock iters return (U.map (/ fromIntegral iters) times, U.length times) thd3 (_, _, c) = c diff -Nru haskell-criterion-0.5.0.10/Criterion/IO.hs haskell-criterion-0.6.0.1/Criterion/IO.hs --- haskell-criterion-0.5.0.10/Criterion/IO.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/IO.hs 2012-01-21 22:32:16.000000000 +0000 @@ -12,7 +12,8 @@ {-# LANGUAGE FlexibleInstances, Rank2Types, TypeSynonymInstances #-} module Criterion.IO ( - note + CritHPrintfType + , note , printError , prolix , summary @@ -27,14 +28,15 @@ import qualified Text.Printf (HPrintfType, hPrintf) import Text.Printf (PrintfArg) --- First item is the action to print now, given all the arguments gathered --- together so far. The second item is the function that will take a further argument --- and give back a new PrintfCont. +-- First item is the action to print now, given all the arguments +-- gathered together so far. The second item is the function that +-- will take a further argument and give back a new PrintfCont. data PrintfCont = PrintfCont (IO ()) (PrintfArg a => a -> PrintfCont) --- An internal class that acts like Printf/HPrintf. +-- | An internal class that acts like Printf/HPrintf. -- --- The implementation is visible to the rest of the program, but the class is +-- The implementation is visible to the rest of the program, but the +-- details of the class are not. class CritHPrintfType a where chPrintfImpl :: (Config -> Bool) -> PrintfCont -> a @@ -55,12 +57,16 @@ chPrintf :: CritHPrintfType r => (Config -> Bool) -> Handle -> String -> r chPrintf shouldPrint h s - = chPrintfImpl shouldPrint (make (Text.Printf.hPrintf h s) (Text.Printf.hPrintf h s)) + = chPrintfImpl shouldPrint (make (Text.Printf.hPrintf h s) + (Text.Printf.hPrintf h s)) where - make :: IO () -> (forall a r. (PrintfArg a, Text.Printf.HPrintfType r) => a -> r) -> PrintfCont - make curCall curCall' = PrintfCont curCall (\x -> make (curCall' x) (curCall' x)) + make :: IO () -> (forall a r. (PrintfArg a, Text.Printf.HPrintfType r) => + a -> r) -> PrintfCont + make curCall curCall' = PrintfCont curCall (\x -> make (curCall' x) + (curCall' x)) -{- A demonstration of how to write printf in this style, in case it is ever needed +{- A demonstration of how to write printf in this style, in case it is +ever needed in fututre: cPrintf :: CritHPrintfType r => (Config -> Bool) -> String -> r diff -Nru haskell-criterion-0.5.0.10/Criterion/Main.hs haskell-criterion-0.6.0.1/Criterion/Main.hs --- haskell-criterion-0.5.0.10/Criterion/Main.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/Main.hs 2012-01-21 22:32:16.000000000 +0000 @@ -1,6 +1,6 @@ -- | -- Module : Criterion.Main --- Copyright : (c) 2009, 2010 Bryan O'Sullivan +-- Copyright : (c) 2009, 2010, 2011 Bryan O'Sullivan -- -- License : BSD-style -- Maintainer : bos@serpentine.com @@ -43,13 +43,11 @@ , parseArgs ) where -import Control.Monad (MonadPlus(..)) import Control.Monad.Trans (liftIO) import Criterion (runAndAnalyse) import Criterion.Config import Criterion.Environment (measureEnvironment) import Criterion.IO (note, printError) -import Criterion.MultiMap (singleton) import Criterion.Monad (Criterion, withConfig) import Criterion.Types (Benchmarkable(..), Benchmark(..), Pure, bench, benchNames, bgroup, nf, nfIO, whnf, whnfIO) @@ -58,36 +56,6 @@ import System.Console.GetOpt import System.Environment (getArgs, getProgName) import System.Exit (ExitCode(..), exitWith) -import Text.Parsec -import Text.Parsec.String - --- | Parse a plot output. -parsePlot :: Parser PlotOutput -parsePlot = try (dim "window" Window 800 600) - `mplus` try (dim "win" Window 800 600) - `mplus` try (dim "pdf" PDF 432 324) - `mplus` try (dim "png" PNG 800 600) - `mplus` try (dim "svg" SVG 432 324) - `mplus` (string "csv" >> return CSV) - where dim s c dx dy = do - _ <- string s - try (uncurry c `fmap` dimensions) `mplus` - (eof >> return (c dx dy)) - dimensions = do - _ <- char ':' - a <- many1 digit - _ <- char 'x' - b <- many1 digit - case (reads a, reads b) of - ([(x,[])],[(y,[])]) -> return (x, y) - _ -> mzero - "dimensions" - --- | Parse a plot type. -plot :: Plot -> String -> IO Config -plot p s = case parse parsePlot "" s of - Left _err -> parseError "unknown plot type\n" - Right t -> return mempty { cfgPlot = singleton p t } -- | Parse a confidence interval. ci :: String -> IO Config @@ -127,10 +95,9 @@ "bootstrap confidence interval" , Option ['l'] ["list"] (noArg mempty { cfgPrintExit = List }) "print only a list of benchmark names" - , Option ['k'] ["plot-kde"] (ReqArg (plot KernelDensity) "TYPE") - "plot kernel density estimate of probabilities" - , Option [] ["kde-same-axis"] (noArg mempty {cfgPlotSameAxis = ljust True }) - "plot all KDE graphs with identical X axes" + , Option ['o'] ["output"] + (ReqArg (\t -> return $ mempty { cfgReport = ljust t }) "FILENAME") + "report file to write to" , Option ['q'] ["quiet"] (noArg mempty { cfgVerbosity = ljust Quiet }) "print less output" , Option [] ["resamples"] @@ -139,8 +106,9 @@ , Option ['s'] ["samples"] (ReqArg (pos "sample count" $ \n -> mempty { cfgSamples = n }) "N") "number of samples to collect" - , Option ['t'] ["plot-timing"] (ReqArg (plot Timing) "TYPE") - "plot timings" + , Option ['t'] ["template"] + (ReqArg (\t -> return $ mempty { cfgTemplate = ljust t }) "FILENAME") + "template file to use" , Option ['u'] ["summary"] (ReqArg (\s -> return $ mempty { cfgSummaryFile = ljust s }) "FILENAME") "produce a summary CSV file of all results" , Option ['V'] ["version"] (noArg mempty { cfgPrintExit = Version }) @@ -159,21 +127,8 @@ printUsage options exitCode = do p <- getProgName putStr (usageInfo ("Usage: " ++ p ++ " [OPTIONS] [BENCHMARKS]") options) - mapM_ putStrLn [ - "" - , "If no benchmark names are given, all are run" - , "Otherwise, benchmarks are run by prefix match" - , "" - , "Plot types:" - , " window or win display a window immediately" - , " csv save a CSV file" - , " pdf save a PDF file" - , " png save a PNG file" - , " svg save an SVG file" - , "" - , "You can specify plot dimensions via a suffix, e.g. \"window:640x480\"" - , "Units are pixels for png and window, 72dpi points for pdf and svg" - ] + putStrLn "If no benchmark names are given, all are run\n\ + \Otherwise, benchmarks are run by prefix match" exitWith exitCode -- | Parse command line options. @@ -217,8 +172,8 @@ -- > import Criterion.Main -- > -- > myConfig = defaultConfig { --- > -- Always display an 800x600 window with curves. --- > cfgPlot = M.singleton KernelDensity (Window 800 600) +-- > -- Always GC between runs. +-- > cfgPerformGC = ljust True -- > } -- > -- > main = defaultMainWith myConfig (return ()) [ diff -Nru haskell-criterion-0.5.0.10/Criterion/Measurement.hs haskell-criterion-0.6.0.1/Criterion/Measurement.hs --- haskell-criterion-0.5.0.10/Criterion/Measurement.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/Measurement.hs 2012-01-21 22:32:16.000000000 +0000 @@ -40,7 +40,7 @@ return $! end - start getTime :: IO Double -getTime = (fromRational . toRational) `fmap` getPOSIXTime +getTime = realToFrac `fmap` getPOSIXTime runForAtLeast :: Double -> Int -> (Int -> IO a) -> IO (Double, Int, a) runForAtLeast howLong initSeed act = loop initSeed (0::Int) =<< getTime diff -Nru haskell-criterion-0.5.0.10/Criterion/MultiMap.hs haskell-criterion-0.6.0.1/Criterion/MultiMap.hs --- haskell-criterion-0.5.0.10/Criterion/MultiMap.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/MultiMap.hs 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -module Criterion.MultiMap - ( - MultiMap - , fromMap - , toMap - , singleton - , lookup - ) where - -import Data.Monoid (Monoid(..)) -import Prelude hiding (lookup) -import qualified Data.Map as M -import qualified Data.Set as S - -newtype MultiMap k v = MultiMap { - toMap :: M.Map k (S.Set v) - } - deriving (Eq, Ord, Read, Show) - -instance (Ord k, Ord v) => Monoid (MultiMap k v) where - mempty = MultiMap M.empty - mappend (MultiMap a) (MultiMap b) = MultiMap (M.unionWith S.union a b) - mconcat = MultiMap . M.unionsWith S.union . map toMap - -fromMap :: M.Map k (S.Set v) -> MultiMap k v -fromMap = MultiMap - -singleton :: k -> v -> MultiMap k v -singleton k v = MultiMap $ M.singleton k (S.singleton v) - -lookup :: (Ord k, Ord v) => k -> MultiMap k v -> Maybe (S.Set v) -lookup k = M.lookup k . toMap diff -Nru haskell-criterion-0.5.0.10/Criterion/Plot.hs haskell-criterion-0.6.0.1/Criterion/Plot.hs --- haskell-criterion-0.5.0.10/Criterion/Plot.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/Plot.hs 1970-01-01 00:00:00.000000000 +0000 @@ -1,232 +0,0 @@ -{-# LANGUAGE CPP, ScopedTypeVariables, TypeOperators #-} - --- | --- Module : Criterion.Plot --- Copyright : (c) 2009, 2010, 2011 Bryan O'Sullivan --- --- License : BSD-style --- Maintainer : bos@serpentine.com --- Stability : experimental --- Portability : GHC --- --- Plotting functions. - -module Criterion.Plot - ( - plotKDE - , plotTiming - , plotWith - ) where - -import Control.Monad.Trans (liftIO) -import Criterion.Config -import Criterion.IO (printError) -import Criterion.Monad (Criterion, getConfigItem) -import Data.Char (isSpace, toLower) -import Data.Foldable (forM_) -import Data.List (group, intersperse) -import Statistics.Function (indexed) -import Statistics.KernelDensity (Points, fromPoints) -import Statistics.Types (Sample) -import System.FilePath (pathSeparator) -import System.IO (IOMode(..), Handle, hPutStr, withBinaryFile) -import Text.Printf (printf) -import qualified Criterion.MultiMap as M -import qualified Data.Vector.Unboxed as U - -#ifdef HAVE_CHART -# if MIN_VERSION_base(4,3,0) -import Control.Monad (void) -# endif - -import Data.Accessor ((^=)) -import Graphics.Rendering.Chart hiding (Plot,c) -# ifdef HAVE_GTK -import Graphics.Rendering.Chart.Gtk (renderableToWindow) -# endif -#endif - -plotWith :: Plot -> (PlotOutput -> IO ()) -> Criterion () -plotWith p plot = getConfigItem (M.lookup p . cfgPlot) - >>= maybe (return ()) (liftIO . flip forM_ plot) - --- | Plot timing data. -plotTiming :: PlotOutput -- ^ The kind of output desired. - -> String -- ^ Benchmark name. - -> Sample -- ^ Timing data. - -> IO () - -plotTiming CSV desc times = do - writeTo (mangle $ printf "%s timings.csv" desc) $ \h -> do - putRow h ["sample", "execution time"] - forM_ (U.toList $ indexed times) $ \(x,y) -> - putRow h [show x, show y] - -#ifdef HAVE_CHART -plotTiming (PDF x y) desc times = void $ - renderableToPDFFile (renderTiming desc times) x y - (mangle $ printf "%s timings %dx%d.pdf" desc x y) - -plotTiming (PNG x y) desc times = void $ - renderableToPNGFile (renderTiming desc times) x y - (mangle $ printf "%s timings %dx%d.png" desc x y) - -plotTiming (SVG x y) desc times = void $ - renderableToSVGFile (renderTiming desc times) x y - (mangle $ printf "%s timings %dx%d.svg" desc x y) - -# ifdef HAVE_GTK -plotTiming (Window x y) desc times = void $ - renderableToWindow (renderTiming desc times) x y -# endif -#endif - -plotTiming output _desc _times = - printError "ERROR: output type %s not supported on this platform\n" - (show output) - --- | Plot kernel density estimate. -plotKDE :: PlotOutput -- ^ The kind of output desired. - -> String -- ^ Benchmark name. - -> Maybe (Double, Double) -- ^ Range of x-axis - -> Points -- ^ Points at which KDE was computed. - -> U.Vector Double -- ^ Kernel density estimates. - -> IO () - -plotKDE CSV desc _exs points pdf = do - writeTo (mangle $ printf "%s densities.csv" desc) $ \h -> do - putRow h ["execution time", "probability"] - forM_ (zip (U.toList pdf) (U.toList (fromPoints points))) $ \(x, y) -> - putRow h [show x, show y] - -#ifdef HAVE_CHART -plotKDE (PDF x y) desc exs points pdf = void $ - renderableToPDFFile (renderKDE desc exs points pdf) x y - (mangle $ printf "%s densities %dx%d.pdf" desc x y) - -plotKDE (PNG x y) desc exs points pdf = void $ - renderableToPNGFile (renderKDE desc exs points pdf) x y - (mangle $ printf "%s densities %dx%d.png" desc x y) - -plotKDE (SVG x y) desc exs points pdf = void $ - renderableToSVGFile (renderKDE desc exs points pdf) x y - (mangle $ printf "%s densities %dx%d.svg" desc x y) - -# ifdef HAVE_GTK -plotKDE (Window x y) desc exs points pdf = void $ - renderableToWindow (renderKDE desc exs points pdf) x y -# endif -#endif - -plotKDE output _desc _exs _points _pdf = - printError "ERROR: output type %s not supported on this platform\n" - (show output) - -#ifdef HAVE_CHART -renderTiming :: String -> Sample -> Renderable () -renderTiming desc times = toRenderable layout - where - layout = layout1_title ^= "Execution times for \"" ++ desc ++ "\"" - $ layout1_plots ^= [ Left (plotBars bars) ] - $ layout1_left_axis ^= leftAxis - $ layout1_bottom_axis ^= bottomAxis - $ defaultLayout1 :: Layout1 Double Double - - leftAxis = laxis_generate ^= autoScaledAxis secAxis - $ laxis_title ^= "execution time" - $ defaultLayoutAxis - - bottomAxis = laxis_title ^= "number of samples" - $ defaultLayoutAxis - - bars = plot_bars_values ^= (zip [0.5,1.5..] . map (:[]) . U.toList $ times) - $ plot_bars_item_styles ^= [ (solidFillStyle c, Nothing) | c <- defaultColorSeq ] - $ plot_bars_spacing ^= BarsFixGap 0 2 - $ defaultPlotBars - -renderKDE :: String -> Maybe (Double, Double) -> Points -> U.Vector Double - -> Renderable () -renderKDE desc exs points pdf = toRenderable layout - where - layout = layout1_title ^= "Densities of execution times for \"" ++ - desc ++ "\"" - $ layout1_plots ^= [ Left (toPlot info) ] - $ layout1_left_axis ^= leftAxis - $ layout1_bottom_axis ^= bottomAxis - $ defaultLayout1 :: Layout1 Double Double - - leftAxis = laxis_title ^= "estimate of probability density" - $ defaultLayoutAxis - - bottomAxis = laxis_generate ^= semiAutoScaledAxis secAxis - $ laxis_title ^= "execution time" - $ defaultLayoutAxis - - semiAutoScaledAxis opts ps = autoScaledAxis opts (extremities ++ ps) - extremities = maybe [] (\(lo, hi) -> [lo, hi]) exs - - info = plot_lines_values ^= [zip (U.toList (fromPoints points)) (U.toList spdf)] - $ defaultPlotLines - - -- Normalise the PDF estimates into a semi-sane range. - spdf = U.map (/ U.sum pdf) pdf - --- | An axis whose labels display as seconds (or fractions thereof). -secAxis :: LinearAxisParams Double -secAxis = la_labelf ^= secs - $ defaultLinearAxis - --- | Try to render meaningful time-axis labels. --- --- /FIXME/: Trouble is, we need to know the range of times for this to --- work properly, so that we don't accidentally display consecutive --- values that appear identical (e.g. \"43 ms, 43 ms\"). -secs :: Double -> String -secs k - | k < 0 = '-' : secs (-k) - | k >= 1e9 = (k/1e9) `with` "Gs" - | k >= 1e6 = (k/1e6) `with` "Ms" - | k >= 1e4 = (k/1e3) `with` "Ks" - | k >= 1 = k `with` "s" - | k >= 1e-3 = (k*1e3) `with` "ms" - | k >= 1e-6 = (k*1e6) `with` "us" - | k >= 1e-9 = (k*1e9) `with` "ns" - | k >= 1e-12 = (k*1e12) `with` "ps" - | otherwise = printf "%g s" k - where with (t :: Double) (u :: String) - | t >= 1e9 = printf "%.4g %s" t u - | t >= 1e6 = printf "%.0f %s" t u - | t >= 1e5 = printf "%.0f %s" t u - | t >= 1e4 = printf "%.0f %s" t u - | t >= 1e3 = printf "%.0f %s" t u - | t >= 1e2 = printf "%.0f %s" t u - | t >= 1e1 = printf "%.1f %s" t u - | otherwise = printf "%.2f %s" t u -#endif - -writeTo :: FilePath -> (Handle -> IO a) -> IO a -writeTo path = withBinaryFile path WriteMode - -escapeCSV :: String -> String -escapeCSV xs | any (`elem`xs) escapes = '"' : concatMap esc xs ++ "\"" - | otherwise = xs - where esc '"' = "\"\"" - esc c = [c] - escapes = "\"\r\n," - -putRow :: Handle -> [String] -> IO () -putRow h s = hPutStr h (concat (intersperse "," (map escapeCSV s)) ++ "\r\n") - --- | Get rid of spaces and other potentially troublesome characters --- from output. -mangle :: String -> FilePath -mangle = concatMap (replace ((==) '-' . head) "-") - . group - . map (replace isSpace '-' . replace (==pathSeparator) '-' . toLower) - where replace p r c | p c = r - | otherwise = c - -#if defined(HAVE_CHART) && !MIN_VERSION_base(4,3,0) -void :: (Monad m) => m a -> m () -void f = f >> return () -#endif diff -Nru haskell-criterion-0.5.0.10/Criterion/Report.hs haskell-criterion-0.6.0.1/Criterion/Report.hs --- haskell-criterion-0.5.0.10/Criterion/Report.hs 1970-01-01 00:00:00.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/Report.hs 2012-01-21 22:32:16.000000000 +0000 @@ -0,0 +1,190 @@ +{-# LANGUAGE DeriveDataTypeable, OverloadedStrings, RecordWildCards, + ScopedTypeVariables #-} + +-- | +-- Module : Criterion.Report +-- Copyright : (c) 2011 Bryan O'Sullivan +-- +-- License : BSD-style +-- Maintainer : bos@serpentine.com +-- Stability : experimental +-- Portability : GHC +-- +-- Reporting functions. + +module Criterion.Report + ( + Report(..) + , formatReport + , report + -- * Rendering helper functions + , TemplateException(..) + , loadTemplate + , includeFile + , templateDir + , vector + , vector2 + ) where + +import Control.Exception (Exception, IOException, catch, throwIO) +import Control.Monad (mplus) +import Control.Monad.IO.Class (MonadIO(liftIO)) +import Criterion.Analysis (Outliers(..), SampleAnalysis(..)) +import Criterion.Config (cfgReport, cfgTemplate, fromLJ) +import Criterion.Monad (Criterion, getConfig) +import Data.Data (Data, Typeable) +import Data.Monoid (Last(..)) +import Paths_criterion (getDataFileName) +import Prelude hiding (catch) +import Statistics.Sample.KernelDensity (kde) +import Statistics.Types (Sample) +import System.Directory (doesFileExist) +import System.FilePath ((), isPathSeparator) +import System.IO.Unsafe (unsafePerformIO) +import Text.Hastache (MuType(..)) +import Text.Hastache.Context (mkGenericContext, mkStrContext) +import qualified Data.ByteString.Char8 as B +import qualified Data.ByteString.Lazy as L +import qualified Data.Vector.Generic as G +import qualified Data.Vector.Unboxed as U +import qualified Text.Hastache as H + +data Report = Report { + reportNumber :: Int + , reportName :: String + , reportTimes :: Sample + , reportAnalysis :: SampleAnalysis + , reportOutliers :: Outliers + } deriving (Eq, Show, Typeable, Data) + +-- | The path to the template and other files used for generating +-- reports. +templateDir :: FilePath +templateDir = unsafePerformIO $ getDataFileName "templates" +{-# NOINLINE templateDir #-} + +-- | Write out a series of 'Report' values to a single file, if +-- configured to do so. +report :: [Report] -> Criterion () +report reports = do + cfg <- getConfig + case cfgReport cfg of + Last Nothing -> return () + Last (Just name) -> liftIO $ do + tpl <- loadTemplate [".",templateDir] (fromLJ cfgTemplate cfg) + L.writeFile name =<< formatReport reports tpl + +-- | Format a series of 'Report' values using the given Hastache +-- template. +formatReport :: [Report] + -> B.ByteString -- ^ Hastache template. + -> IO L.ByteString +formatReport reports template = do + let context "report" = MuList $ map inner reports + context "include" = MuLambdaM $ includeFile [templateDir] + context _ = MuNothing + inner Report{..} = mkStrContext $ \nym -> + case nym of + "name" -> MuVariable reportName + "number" -> MuVariable reportNumber + "times" -> vector "x" reportTimes + "kdetimes" -> vector "x" kdeTimes + "kdepdf" -> vector "x" kdePDF + "kde" -> vector2 "time" "pdf" kdeTimes kdePDF + ('a':'n':_)-> mkGenericContext reportAnalysis $ + H.encodeStr nym + _ -> mkGenericContext reportOutliers $ + H.encodeStr nym + where (kdeTimes,kdePDF) = kde 128 reportTimes + H.hastacheStr H.defaultConfig template context + +-- | Render the elements of a vector. +-- +-- For example, given this piece of Haskell: +-- +-- @'mkStrContext' $ \\name -> +-- case name of +-- \"foo\" -> 'vector' \"x\" foo@ +-- +-- It will substitute each value in the vector for @x@ in the +-- following Hastache template: +-- +-- > {{#foo}} +-- > {{x}} +-- > {{/foo}} +vector :: (Monad m, G.Vector v a, H.MuVar a) => + String -- ^ Name to use when substituting. + -> v a + -> MuType m +{-# SPECIALIZE vector :: String -> U.Vector Double -> MuType IO #-} +vector name v = MuList . map val . G.toList $ v + where val i = mkStrContext $ \nym -> + if nym == name + then MuVariable i + else MuNothing + +-- | Render the elements of two vectors. +vector2 :: (Monad m, G.Vector v a, G.Vector v b, H.MuVar a, H.MuVar b) => + String -- ^ Name for elements from the first vector. + -> String -- ^ Name for elements from the second vector. + -> v a -- ^ First vector. + -> v b -- ^ Second vector. + -> MuType m +{-# SPECIALIZE vector2 :: String -> String -> U.Vector Double -> U.Vector Double + -> MuType IO #-} +vector2 name1 name2 v1 v2 = MuList $ zipWith val (G.toList v1) (G.toList v2) + where val i j = mkStrContext $ \nym -> + case undefined of + _| nym == name1 -> MuVariable i + | nym == name2 -> MuVariable j + | otherwise -> MuNothing + +-- | Attempt to include the contents of a file based on a search path. +-- Returns 'B.empty' if the search fails or the file could not be read. +-- +-- Intended for use with Hastache's 'MuLambdaM', for example: +-- +-- @context \"include\" = 'MuLambdaM' $ 'includeFile' ['templateDir']@ +-- +-- Hastache template expansion is /not/ performed within the included +-- file. No attempt is made to ensure that the included file path is +-- safe, i.e. that it does not refer to an unexpected file such as +-- \"@/etc/passwd@\". +includeFile :: (MonadIO m) => + [FilePath] -- ^ Directories to search. + -> B.ByteString -- ^ Name of the file to search for. + -> m B.ByteString +{-# SPECIALIZE includeFile :: [FilePath] -> B.ByteString -> IO B.ByteString #-} +includeFile searchPath name = liftIO $ foldr go (return B.empty) searchPath + where go dir next = do + let path = dir H.decodeStr name + B.readFile path `catch` \(_::IOException) -> next + +-- | A problem arose with a template. +data TemplateException = + TemplateNotFound FilePath -- ^ The template could not be found. + deriving (Eq, Show, Typeable, Data) + +instance Exception TemplateException + +-- | Load a Hastache template file. +-- +-- If the name is an absolute or relative path, the search path is +-- /not/ used, and the name is treated as a literal path. +-- +-- This function throws a 'TemplateException' if the template could +-- not be found, or an 'IOException' if no template could be loaded. +loadTemplate :: [FilePath] -- ^ Search path. + -> FilePath -- ^ Name of template file. + -> IO B.ByteString +loadTemplate paths name + | any isPathSeparator name = B.readFile name + | otherwise = go Nothing paths + where go me (p:ps) = do + let cur = p name + x <- doesFileExist cur + if x + then B.readFile cur `catch` \e -> go (me `mplus` Just e) ps + else go me ps + go (Just e) _ = throwIO (e::IOException) + go _ _ = throwIO . TemplateNotFound $ name diff -Nru haskell-criterion-0.5.0.10/Criterion/Types.hs haskell-criterion-0.6.0.1/Criterion/Types.hs --- haskell-criterion-0.5.0.10/Criterion/Types.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion/Types.hs 2012-01-21 22:32:16.000000000 +0000 @@ -76,7 +76,7 @@ -- | Perform an action, then evaluate its result to weak head normal -- form (WHNF). This is useful for forcing an IO action whose result -- is an expression to be evaluated down to a more useful value. -whnfIO :: NFData a => IO a -> IO () +whnfIO :: IO a -> IO () whnfIO a = a >>= evaluate >> return () {-# INLINE whnfIO #-} diff -Nru haskell-criterion-0.5.0.10/criterion.cabal haskell-criterion-0.6.0.1/criterion.cabal --- haskell-criterion-0.5.0.10/criterion.cabal 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/criterion.cabal 2012-01-21 22:32:16.000000000 +0000 @@ -1,82 +1,80 @@ name: criterion -version: 0.5.0.10 +version: 0.6.0.1 synopsis: Robust, reliable performance measurement and analysis license: BSD3 license-file: LICENSE author: Bryan O'Sullivan maintainer: Bryan O'Sullivan copyright: 2009, 2010, 2011 Bryan O'Sullivan -category: Development, Performance, Testing -homepage: http://bitbucket.org/bos/criterion -bug-reports: http://bitbucket.org/bos/criterion/issues +category: Development, Performance, Testing, Benchmarking +homepage: https://github.com/bos/criterion +bug-reports: https://github.com/bos/criterion/issues build-type: Simple cabal-version: >= 1.6 extra-source-files: README.markdown - examples/Fibber.hs - examples/Judy.hs - examples/Makefile - examples/Tiny.hs + examples/*.hs + examples/*.html + +data-files: + templates/js/excanvas-r3.min.js + templates/js/jquery-1.6.4.min.js + templates/js/jquery.criterion.js + templates/js/jquery.flot-0.7.min.js + templates/*.css + templates/*.tpl + description: - This library provides a powerful but simple way to measure the - performance of Haskell code. It provides both a framework for - executing and analysing benchmarks and a set of driver functions - that makes it easy to build and run benchmarks, and to analyse their - results. + This library provides a powerful but simple way to measure software + performance. It provides both a framework for executing and + analysing benchmarks and a set of driver functions that makes it + easy to build and run benchmarks, and to analyse their results. . The fastest way to get started is to read the documentation and examples in the Criterion.Main module. - -flag Chart - description: enable use of the Chart package - -- Broken under GHC 6.12 so far. - default: False - -flag gtk - description: enable displaying charts in GTK+ windows - default: False + . + For an example of the kinds of reports that criterion generates, see + . library exposed-modules: Criterion Criterion.Analysis + Criterion.Analysis.Types Criterion.Config Criterion.Environment Criterion.IO Criterion.Main Criterion.Measurement Criterion.Monad - Criterion.MultiMap - Criterion.Plot + Criterion.Report Criterion.Types + other-modules: + Paths_criterion + build-depends: + aeson >= 0.3.2.12, base < 5, bytestring >= 0.9 && < 1.0, containers, deepseq >= 1.1.0.0, + directory, filepath, - mtl, + hastache >= 0.1.5, + mtl >= 2, mwc-random >= 0.8.0.3, parsec >= 3.1.0, - statistics >= 0.8.0.5, + statistics >= 0.10.0.0, time, - vector >= 0.7.0.0, + transformers, + vector >= 0.7.1, vector-algorithms >= 0.4 - if flag(chart) - build-depends: - Chart >= 0.13 && < 0.15, - data-accessor - cpp-options: -DHAVE_CHART - - if flag(gtk) - cpp-options: -DHAVE_GTK - - ghc-options: -Wall -funbox-strict-fields + ghc-options: -O2 -Wall -funbox-strict-fields if impl(ghc >= 6.8) ghc-options: -fwarn-tabs source-repository head - type: mercurial - location: http://bitbucket.org/bos/criterion + type: git + location: git://github.com/bos/criterion.git diff -Nru haskell-criterion-0.5.0.10/Criterion.hs haskell-criterion-0.6.0.1/Criterion.hs --- haskell-criterion-0.5.0.10/Criterion.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/Criterion.hs 2012-01-21 22:32:16.000000000 +0000 @@ -1,6 +1,7 @@ +{-# LANGUAGE RecordWildCards #-} -- | -- Module : Criterion --- Copyright : (c) 2009, 2010 Bryan O'Sullivan +-- Copyright : (c) 2009, 2010, 2011 Bryan O'Sullivan -- -- License : BSD-style -- Maintainer : bos@serpentine.com @@ -24,26 +25,22 @@ , runAndAnalyse ) where -import Control.Monad ((<=<), forM_, replicateM_, when) +import Control.Monad ((<=<), replicateM_, when) import Control.Monad.Trans (liftIO) -import Criterion.Analysis (OutlierVariance(..), classifyOutliers, - outlierVariance, noteOutliers) -import Criterion.Config (Config(..), Plot(..), Verbosity(..), fromLJ) +import Criterion.Analysis (Outliers(..), OutlierEffect(..), OutlierVariance(..), + SampleAnalysis(..), analyseSample, + classifyOutliers, noteOutliers) +import Criterion.Config (Config(..), Verbosity(..), fromLJ) import Criterion.Environment (Environment(..)) import Criterion.IO (note, prolix, summary) import Criterion.Measurement (getTime, runForAtLeast, secs, time_) import Criterion.Monad (Criterion, getConfig, getConfigItem) -import Criterion.Plot (plotWith, plotKDE, plotTiming) +import Criterion.Report (Report(..), report) import Criterion.Types (Benchmarkable(..), Benchmark(..), Pure, bench, bgroup, nf, nfIO, whnf, whnfIO) import qualified Data.Vector.Unboxed as U -import Statistics.Function (create, minMax) -import Statistics.KernelDensity (epanechnikovPDF) -import Statistics.Resampling (Resample, resample) -import Statistics.Resampling.Bootstrap (Estimate(..), bootstrapBCA) -import Statistics.Sample (mean, stdDev) +import Statistics.Resampling.Bootstrap (Estimate(..)) import Statistics.Types (Sample) -import System.Random.MWC (withSystemRandom) import System.Mem (performGC) import Text.Printf (printf) @@ -66,41 +63,38 @@ note "collecting %d samples, %d iterations each, in estimated %s\n" sampleCount newIters (secs estTime) times <- liftIO . fmap (U.map ((/ newItersD) . subtract (envClockCost env))) . - create sampleCount . const $ do + U.replicateM sampleCount $ do when (fromLJ cfgPerformGC cfg) $ performGC time_ (run b newIters) return times -- | Run a single benchmark and analyse its performance. runAndAnalyseOne :: Benchmarkable b => Environment -> String -> b - -> Criterion Sample + -> Criterion (Sample,SampleAnalysis,Outliers) runAndAnalyseOne env _desc b = do times <- runBenchmark env b - let numSamples = U.length times - let ests = [mean,stdDev] - numResamples <- getConfigItem $ fromLJ cfgResamples - _ <- prolix "bootstrapping with %d resamples\n" numResamples - res <- liftIO . withSystemRandom $ \gen -> - resample gen ests numResamples times :: IO [Resample] ci <- getConfigItem $ fromLJ cfgConfInterval - let [em,es] = bootstrapBCA ci times ests res - (effect, v) = outlierVariance em es (fromIntegral $ numSamples) - wibble = case effect of + numResamples <- getConfigItem $ fromLJ cfgResamples + _ <- prolix "analysing with %d resamples\n" numResamples + an@SampleAnalysis{..} <- liftIO $ analyseSample ci times numResamples + let OutlierVariance{..} = anOutlierVar + let wibble = case ovEffect of Unaffected -> "unaffected" :: String Slight -> "slightly inflated" Moderate -> "moderately inflated" Severe -> "severely inflated" - bs "mean" em + bs "mean" anMean summary "," - bs "std dev" es + bs "std dev" anStdDev summary "\n" vrb <- getConfigItem $ fromLJ cfgVerbosity - when (vrb == Verbose || (effect > Unaffected && vrb > Quiet)) $ do - noteOutliers (classifyOutliers times) - _ <- note "variance introduced by outliers: %.3f%%\n" (v * 100) + let out = classifyOutliers times + when (vrb == Verbose || (ovEffect > Unaffected && vrb > Quiet)) $ do + noteOutliers out + _ <- note "variance introduced by outliers: %.3f%%\n" (ovFraction * 100) _ <- note "variance is %s by outliers\n" wibble return () - return times + return (times,an,out) where bs :: String -> Estimate -> Criterion () bs d e = do _ <- note "%s: %s, lb %s, ub %s, ci %.3f\n" d (secs $ estPoint e) @@ -110,20 +104,9 @@ (estPoint e) (estLowerBound e) (estUpperBound e) -plotAll :: [(String, Sample)] -> Criterion () -plotAll descTimes = forM_ descTimes $ \(desc,times) -> do - plotWith Timing $ \o -> plotTiming o desc times - plotWith KernelDensity $ \o -> uncurry (plotKDE o desc extremes) - (epanechnikovPDF 100 times) - where - extremes = case descTimes of - (_:_:_) -> toJust . minMax . concatU . map snd $ descTimes - _ -> Nothing - concatU = foldr (U.++) U.empty - toJust r@(lo, hi) - | lo == infinity || hi == -infinity = Nothing - | otherwise = Just r - where infinity = 1/0 +plotAll :: [(String, Sample, SampleAnalysis, Outliers)] -> Criterion () +plotAll descTimes = do + report (zipWith (\n (d,t,a,o) -> Report n d t a o) [0..] descTimes) -- | Run, and analyse, one or more benchmarks. runAndAnalyse :: (String -> Bool) -- ^ A predicate that chooses @@ -136,11 +119,8 @@ where go pfx (Benchmark desc b) | p desc' = do _ <- note "\nbenchmarking %s\n" desc' summary (show desc' ++ ",") -- String will be quoted - x <- runAndAnalyseOne env desc' b - sameAxis <- getConfigItem $ fromLJ cfgPlotSameAxis - if sameAxis - then return [(desc',x)] - else plotAll [(desc',x)] >> return [] + (x,an,out) <- runAndAnalyseOne env desc' b + return [(desc',x,an,out)] | otherwise = return [] where desc' = prefix pfx desc go pfx (BenchGroup desc bs) = diff -Nru haskell-criterion-0.5.0.10/debian/changelog haskell-criterion-0.6.0.1/debian/changelog --- haskell-criterion-0.5.0.10/debian/changelog 2011-09-17 15:10:53.000000000 +0000 +++ haskell-criterion-0.6.0.1/debian/changelog 2012-03-17 23:27:37.000000000 +0000 @@ -1,3 +1,22 @@ +haskell-criterion (0.6.0.1-3) unstable; urgency=low + + * Include template files in libghc-criterion-dev, thanks to Tomas Janousek + for noticing (Closes: #664449) + + -- Joachim Breitner Sun, 18 Mar 2012 00:27:37 +0100 + +haskell-criterion (0.6.0.1-2) unstable; urgency=low + + * Sourceful upload to rebuild documentation package + + -- Joachim Breitner Sat, 11 Feb 2012 00:13:15 +0100 + +haskell-criterion (0.6.0.1-1) unstable; urgency=low + + * New upstream release (Closes: #658194) + + -- Joachim Breitner Wed, 01 Feb 2012 18:33:37 +0100 + haskell-criterion (0.5.0.10-2) unstable; urgency=low * Build with Chat support diff -Nru haskell-criterion-0.5.0.10/debian/control haskell-criterion-0.6.0.1/debian/control --- haskell-criterion-0.5.0.10/debian/control 2011-09-17 15:05:07.000000000 +0000 +++ haskell-criterion-0.6.0.1/debian/control 2012-02-10 23:16:34.000000000 +0000 @@ -9,35 +9,37 @@ , haskell-devscripts (>= 0.8) , ghc , ghc-prof - , libghc-deepseq-dev (>= 1.1.0.0) + , libghc-aeson-dev (>= 0.3.2.12) + , libghc-aeson-prof + , libghc-deepseq-dev , libghc-deepseq-prof - , libghc-mtl-dev + , libghc-hastache-dev (>= 0.1.5) + , libghc-hastache-prof + , libghc-mtl-dev (>= 2) , libghc-mtl-prof , libghc-mwc-random-dev (>= 0.8.0.3) , libghc-mwc-random-prof - , libghc-parallel-dev - , libghc-parallel-prof , libghc-parsec3-dev (>= 3.1.0) , libghc-parsec3-prof - , libghc-statistics-dev (>= 0.8.0.5) + , libghc-statistics-dev (>= 0.10.0.0) , libghc-statistics-prof - , libghc-vector-dev (>= 0.7.0.0) + , libghc-transformers-dev + , libghc-transformers-prof + , libghc-vector-dev (>= 0.7.1) , libghc-vector-prof , libghc-vector-algorithms-dev (>= 0.4) , libghc-vector-algorithms-prof - , libghc-chart-dev (>= 0.14-2) - , libghc-chart-dev (<< 0.15) - , libghc-chart-prof Build-Depends-Indep: ghc-doc + , libghc-aeson-doc , libghc-deepseq-doc + , libghc-hastache-doc , libghc-mtl-doc , libghc-mwc-random-doc - , libghc-parallel-doc , libghc-parsec3-doc , libghc-statistics-doc + , libghc-transformers-doc , libghc-vector-doc , libghc-vector-algorithms-doc - , libghc-chart-doc Standards-Version: 3.9.2 Homepage: http://hackage.haskell.org/package/criterion Vcs-Darcs: http://darcs.debian.org/pkg-haskell/haskell-criterion diff -Nru haskell-criterion-0.5.0.10/debian/libghc-criterion-dev.install haskell-criterion-0.6.0.1/debian/libghc-criterion-dev.install --- haskell-criterion-0.5.0.10/debian/libghc-criterion-dev.install 1970-01-01 00:00:00.000000000 +0000 +++ haskell-criterion-0.6.0.1/debian/libghc-criterion-dev.install 2012-03-17 23:18:40.000000000 +0000 @@ -0,0 +1 @@ +templates /usr/share/criterion diff -Nru haskell-criterion-0.5.0.10/debian/rules haskell-criterion-0.6.0.1/debian/rules --- haskell-criterion-0.5.0.10/debian/rules 2011-09-17 15:00:31.000000000 +0000 +++ haskell-criterion-0.6.0.1/debian/rules 2012-03-17 23:18:24.000000000 +0000 @@ -1,6 +1,6 @@ #!/usr/bin/make -f -DEB_SETUP_GHC_CONFIGURE_ARGS=-fchart -fgtk - include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/hlibrary.mk + +DEB_SETUP_GHC_CONFIGURE_ARGS := --datasubdir=/usr/share/$(CABAL_PACKAGE) diff -Nru haskell-criterion-0.5.0.10/examples/Makefile haskell-criterion-0.6.0.1/examples/Makefile --- haskell-criterion-0.5.0.10/examples/Makefile 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/examples/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -all := Fibber Judy Tiny - -all: $(all) - -%: %.hs - ghc -O --make $< - -clean: - -rm -f *.hi *.o $(all) diff -Nru haskell-criterion-0.5.0.10/examples/Tiny.hs haskell-criterion-0.6.0.1/examples/Tiny.hs --- haskell-criterion-0.5.0.10/examples/Tiny.hs 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/examples/Tiny.hs 2012-01-21 22:32:16.000000000 +0000 @@ -5,18 +5,18 @@ import qualified Data.IntMap as I import Data.List (foldl') import Criterion.Config -import qualified Criterion.MultiMap as M -myConfig = defaultConfig { - -- Always display an 800x600 window. - cfgPlot = M.singleton KernelDensity (Window 800 600) - } - -main = defaultMainWith myConfig (return ()) [ - bench "fib 10" $ whnf fib 10 - , bench "fib 30" $ whnf fib 30 - , bench "intmap 50k" $ whnf intmap 50000 - , bench "intmap 75k" $ whnf intmap 75000 +main = defaultMainWith defaultConfig (return ()) [ + bgroup "fib" [ + bench "fib 10" $ whnf fib 10 + , bench "fib 20" $ whnf fib 20 + , bench "fib 30" $ whnf fib 30 + ], + bgroup "intmap" [ + bench "intmap 25k" $ whnf intmap 25000 + , bench "intmap 50k" $ whnf intmap 50000 + , bench "intmap 75k" $ whnf intmap 75000 + ] ] fib :: Int -> Int diff -Nru haskell-criterion-0.5.0.10/examples/tiny.html haskell-criterion-0.6.0.1/examples/tiny.html --- haskell-criterion-0.5.0.10/examples/tiny.html 1970-01-01 00:00:00.000000000 +0000 +++ haskell-criterion-0.6.0.1/examples/tiny.html 2012-01-21 22:32:16.000000000 +0000 @@ -0,0 +1,668 @@ + + + + + criterion report + + + + + + + + +
+
+

criterion performance measurements

+ +

overview

+ +

want to understand this report?

+ +
+ +

fib/fib 10

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
lower boundestimateupper bound
Mean execution time7.950250148027324e-78.087233523139602e-78.263881789521396e-7
Standard deviation6.469576002518438e-87.962093335887086e-89.595188287095253e-8
+ + +

Outlying measurements have severe + (0.789683189845111%) + effect on estimated standard deviation.

+
+

fib/fib 20

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
lower boundestimateupper bound
Mean execution time9.397387721886237e-59.511279240520537e-59.683396722581508e-5
Standard deviation5.084981483933464e-67.060410460215048e-69.916444086871226e-6
+ + +

Outlying measurements have severe + (0.6764999252677036%) + effect on estimated standard deviation.

+
+

fib/fib 30

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
lower boundestimateupper bound
Mean execution time1.1405421545418602e-21.1464177420052388e-21.166933422318349e-2
Standard deviation1.5835878091381052e-45.030517750313856e-41.146763021342376e-3
+ + +

Outlying measurements have moderate + (0.414995643896579%) + effect on estimated standard deviation.

+
+

intmap/intmap 25k

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
lower boundestimateupper bound
Mean execution time5.030530741127831e-35.067442705544335e-35.11489753952871e-3
Standard deviation1.7601420712288937e-42.14104721044797e-42.796949297562274e-4
+ + +

Outlying measurements have moderate + (0.39528660323872544%) + effect on estimated standard deviation.

+
+

intmap/intmap 50k

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
lower boundestimateupper bound
Mean execution time1.3004106333168846e-21.3085197260292869e-21.317617540589223e-2
Standard deviation3.817067615429757e-44.4020726935288003e-45.281243811580562e-4
+ + +

Outlying measurements have moderate + (0.2967324863902443%) + effect on estimated standard deviation.

+
+

intmap/intmap 75k

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
lower boundestimateupper bound
Mean execution time1.772755031815419e-21.782442693940053e-21.794612770310293e-2
Standard deviation4.572927417104507e-45.554628346393567e-47.805157733235236e-4
+ + +

Outlying measurements have moderate + (0.2673858721467461%) + effect on estimated standard deviation.

+
+ +

understanding this report

+ +

In this report, each function benchmarked by criterion is assigned + a section of its own. In each section, we display two charts, each + with an x axis that represents measured execution time. + These charts are active; if you hover your mouse over data points + and annotations, you will see more details.

+ +
    +
  • The chart on the left is a + kernel + density estimate (also known as a KDE) of time + measurements. This graphs the probability of any given time + measurement occurring. A spike indicates that a measurement of a + particular time occurred; its height indicates how often that + measurement was repeated.
  • + +
  • The chart on the right is the raw data from which the kernel + density estimate is built. Measurements are displayed on + the y axis in the order in which they occurred.
  • +
+ +

Under the charts is a small table displaying the mean and standard + deviation of the measurements. We use a statistical technique + called + the bootstrap + to provide confidence intervals on our estimates of these values. + The bootstrap-derived upper and lower bounds on the mean and + standard deviation let you see how accurate we believe those + estimates to be. (Hover the mouse over the table headers to see + the confidence levels.)

+ +

A noisy benchmarking environment can cause some or many + measurements to fall far from the mean. These outlying + measurements can have a significant inflationary effect on the + estimate of the standard deviation. We calculate and display an + estimate of the extent to which the standard deviation has been + inflated by outliers.

+ + + +
+
+ + + diff -Nru haskell-criterion-0.5.0.10/README.markdown haskell-criterion-0.6.0.1/README.markdown --- haskell-criterion-0.5.0.10/README.markdown 2011-06-08 17:31:40.000000000 +0000 +++ haskell-criterion-0.6.0.1/README.markdown 2012-01-21 22:32:16.000000000 +0000 @@ -1,10 +1,13 @@ # Criterion: robust, reliable performance measurement This package provides the Criterion module, a Haskell library for -measuring and analysing the performance of Haskell programs. +measuring and analysing software performance. -To get started, read the documentation for the Criterion.Main module, -and take a look at the programs in the examples directory. +To get started, read the documentation for the +[Criterion.Main](http://hackage.haskell.org/packages/archive/criterion/latest/doc/html/Criterion-Main.html) +module, and take a look at the programs in the +[examples](https://github.com/bos/criterion/tree/master/examples) +directory. # Building and installing @@ -13,28 +16,19 @@ cabal install criterion -On Mac OS X, the Chart library that criterion uses is not available, -so you'll have to build without it. - - cabal install criterion -f-chart - -This will lose you the ability to generate charts, but you'll still be -able to generate CSV files and import them into your favourite -spreadsheet, or gnuplot, or whatnot. - # Get involved! Please report bugs via the -[bitbucket issue tracker](http://bitbucket.org/bos/criterion). +[github issue tracker](https://github.com/bos/criterion). -Master [Mercurial repository](http://bitbucket.org/bos/criterion): +Master [github repository](https://github.com/bos/criterion): -* `hg clone http://bitbucket.org/bos/criterion` +* `git clone git://github.com/bos/criterion.git` -There's also a [git mirror](http://github.com/bos/criterion): +There's also a [Mercurial mirror](http://bitbucket.org/bos/criterion): -* `git clone git://github.com/bos/criterion.git` +* `hg clone https://bitbucket.org/bos/criterion` (You can create and contribute changes using either Mercurial or git.) diff -Nru haskell-criterion-0.5.0.10/templates/criterion.css haskell-criterion-0.6.0.1/templates/criterion.css --- haskell-criterion-0.5.0.10/templates/criterion.css 1970-01-01 00:00:00.000000000 +0000 +++ haskell-criterion-0.6.0.1/templates/criterion.css 2012-01-21 22:32:16.000000000 +0000 @@ -0,0 +1,102 @@ +html, body { + height: 100%; + margin: 0; +} + +#wrap { + min-height: 100%; +} + +#main { + overflow: auto; + padding-bottom: 180px; /* must be same height as the footer */ +} + +#footer { + position: relative; + margin-top: -180px; /* negative value of footer height */ + height: 180px; + clear: both; + background: #888; + margin: 40px 0 0; + color: white; + font-size: larger; + font-weight: 300; +} + +body:before { + /* Opera fix */ + content: ""; + height: 100%; + float: left; + width: 0; + margin-top: -32767px; +} + +body { + font: 14px Helvetica Neue; + text-rendering: optimizeLegibility; + margin-top: 1em; +} + +a:link { + color: steelblue; + text-decoration: none; +} + +a:visited { + color: #4a743b; + text-decoration: none; +} + +#footer a { + color: white; + text-decoration: underline; +} + +.hover { + color: steelblue; + text-decoration: none; +} + +.body { + width: 960px; + margin: auto; +} + +.footfirst { + position: relative; + top: 30px; +} + +th { + font-weight: 500; + opacity: 0.8; +} + +th.cibound { + opacity: 0.4; +} + +.citime { + opacity: 0.5; +} + +h1 { + font-size: 36px; + font-weight: 300; + margin-bottom: .3em; +} + +h2 { + font-size: 30px; + font-weight: 300; + margin-bottom: .3em; +} + +.meanlegend { + color: #404040; + background-color: #ffffff; + opacity: 0.6; + font-size: smaller; +} diff -Nru haskell-criterion-0.5.0.10/templates/js/excanvas-r3.min.js haskell-criterion-0.6.0.1/templates/js/excanvas-r3.min.js --- haskell-criterion-0.5.0.10/templates/js/excanvas-r3.min.js 1970-01-01 00:00:00.000000000 +0000 +++ haskell-criterion-0.6.0.1/templates/js/excanvas-r3.min.js 2012-01-21 22:32:16.000000000 +0000 @@ -0,0 +1 @@ +if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&").replace(/"/g,""")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AHAL.x){AL.x=Z.x}if(AG.y==null||Z.yAL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('','','');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff -Nru haskell-criterion-0.5.0.10/templates/js/jquery-1.6.4.min.js haskell-criterion-0.6.0.1/templates/js/jquery-1.6.4.min.js --- haskell-criterion-0.5.0.10/templates/js/jquery-1.6.4.min.js 1970-01-01 00:00:00.000000000 +0000 +++ haskell-criterion-0.6.0.1/templates/js/jquery-1.6.4.min.js 2012-01-21 22:32:16.000000000 +0000 @@ -0,0 +1,4 @@ +/*! jQuery v1.6.4 http://jquery.com/ | http://jquery.org/license */ +(function(a,b){function cu(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cr(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff -Nru haskell-criterion-0.5.0.10/templates/js/jquery.criterion.js haskell-criterion-0.6.0.1/templates/js/jquery.criterion.js --- haskell-criterion-0.5.0.10/templates/js/jquery.criterion.js 1970-01-01 00:00:00.000000000 +0000 +++ haskell-criterion-0.6.0.1/templates/js/jquery.criterion.js 2012-01-21 22:32:16.000000000 +0000 @@ -0,0 +1,103 @@ +(function ($) { + $.zip = function(a,b) { + var x = Math.min(a.length,b.length); + var c = new Array(x); + for (var i = 0; i < x; i++) + c[i] = [a[i],b[i]]; + return c; + }; + + $.mean = function(ary) { + var m = 0, i = 0; + + while (i < ary.length) { + var j = i++; + m += (ary[j] - m) / i; + } + + return m; + }; + + $.timeUnits = function(secs) { + if (secs < 0) return timeUnits(-secs); + else if (secs >= 1e9) return [1e-9, "Gs"]; + else if (secs >= 1e6) return [1e-6, "Ms"]; + else if (secs >= 1) return [1, "s"]; + else if (secs >= 1e-3) return [1e3, "ms"]; + else if (secs >= 1e-6) return [1e6, "\u03bcs"]; + else if (secs >= 1e-9) return [1e9, "ns"]; + else if (secs >= 1e-12) return [1e12, "ps"]; + }; + + $.scaleTimes = function(ary) { + var s = $.timeUnits($.mean(ary)); + return [$.scaleBy(s[0], ary), s[1]]; + }; + + $.scaleBy = function(x, ary) { + var nary = new Array(ary.length); + for (var i = 0; i < ary.length; i++) + nary[i] = ary[i] * x; + return nary; + }; + + $.renderTime = function(text) { + var x = parseFloat(text); + var t = $.timeUnits(x); + x *= t[0]; + if (x >= 1000 || x <= -1000) return x.toFixed() + " " + t[1]; + var prec = 5; + if (x < 0) prec++; + + return x.toString().substring(0,prec) + " " + t[1]; + }; + + $.unitFormatter = function(units) { + var ticked = 0; + return function(val,axis) { + var s = val.toFixed(axis.tickDecimals); + if (ticked > 1) + return s; + else { + ticked++; + return s + ' ' + units; + } + }; + }; + + $.addTooltip = function(name, renderText) { + function showTooltip(x, y, contents) { + $('
' + contents + '
').css( { + position: 'absolute', + display: 'none', + top: y + 5, + left: x + 5, + border: '1px solid #fdd', + padding: '2px', + 'background-color': '#fee', + opacity: 0.80 + }).appendTo("body").fadeIn(200); + }; + var pp = null; + $(name).bind("plothover", function (event, pos, item) { + $("#x").text(pos.x.toFixed(2)); + $("#y").text(pos.y.toFixed(2)); + + if (item) { + if (pp != item.dataIndex) { + pp = item.dataIndex; + + $("#tooltip").remove(); + var x = item.datapoint[0].toFixed(2), + y = item.datapoint[1].toFixed(2); + + showTooltip(item.pageX, item.pageY, renderText(x,y)); + } + } + else { + $("#tooltip").remove(); + pp = null; + } + }); + }; +})(jQuery); diff -Nru haskell-criterion-0.5.0.10/templates/js/jquery.flot-0.7.min.js haskell-criterion-0.6.0.1/templates/js/jquery.flot-0.7.min.js --- haskell-criterion-0.5.0.10/templates/js/jquery.flot-0.7.min.js 1970-01-01 00:00:00.000000000 +0000 +++ haskell-criterion-0.6.0.1/templates/js/jquery.flot-0.7.min.js 2012-01-21 22:32:16.000000000 +0000 @@ -0,0 +1,6 @@ +/* Javascript plotting library for jQuery, v. 0.7. + * + * Released under the MIT license by IOLA, December 2007. + * + */ +(function(b){b.color={};b.color.make=function(d,e,g,f){var c={};c.r=d||0;c.g=e||0;c.b=g||0;c.a=f!=null?f:1;c.add=function(h,j){for(var k=0;k=1){return"rgb("+[c.r,c.g,c.b].join(",")+")"}else{return"rgba("+[c.r,c.g,c.b,c.a].join(",")+")"}};c.normalize=function(){function h(k,j,l){return jl?l:j)}c.r=h(0,parseInt(c.r),255);c.g=h(0,parseInt(c.g),255);c.b=h(0,parseInt(c.b),255);c.a=h(0,c.a,1);return c};c.clone=function(){return b.color.make(c.r,c.b,c.g,c.a)};return c.normalize()};b.color.extract=function(d,e){var c;do{c=d.css(e).toLowerCase();if(c!=""&&c!="transparent"){break}d=d.parent()}while(!b.nodeName(d.get(0),"body"));if(c=="rgba(0, 0, 0, 0)"){c="transparent"}return b.color.parse(c)};b.color.parse=function(c){var d,f=b.color.make;if(d=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10))}if(d=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10),parseFloat(d[4]))}if(d=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55)}if(d=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55,parseFloat(d[4]))}if(d=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c)){return f(parseInt(d[1],16),parseInt(d[2],16),parseInt(d[3],16))}if(d=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c)){return f(parseInt(d[1]+d[1],16),parseInt(d[2]+d[2],16),parseInt(d[3]+d[3],16))}var e=b.trim(c).toLowerCase();if(e=="transparent"){return f(255,255,255,0)}else{d=a[e]||[0,0,0];return f(d[0],d[1],d[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function(c){function b(av,ai,J,af){var Q=[],O={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{show:null,position:"bottom",mode:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},az=null,ad=null,y=null,H=null,A=null,p=[],aw=[],q={left:0,right:0,top:0,bottom:0},G=0,I=0,h=0,w=0,ak={processOptions:[],processRawData:[],processDatapoints:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},aq=this;aq.setData=aj;aq.setupGrid=t;aq.draw=W;aq.getPlaceholder=function(){return av};aq.getCanvas=function(){return az};aq.getPlotOffset=function(){return q};aq.width=function(){return h};aq.height=function(){return w};aq.offset=function(){var aB=y.offset();aB.left+=q.left;aB.top+=q.top;return aB};aq.getData=function(){return Q};aq.getAxes=function(){var aC={},aB;c.each(p.concat(aw),function(aD,aE){if(aE){aC[aE.direction+(aE.n!=1?aE.n:"")+"axis"]=aE}});return aC};aq.getXAxes=function(){return p};aq.getYAxes=function(){return aw};aq.c2p=C;aq.p2c=ar;aq.getOptions=function(){return O};aq.highlight=x;aq.unhighlight=T;aq.triggerRedrawOverlay=f;aq.pointOffset=function(aB){return{left:parseInt(p[aA(aB,"x")-1].p2c(+aB.x)+q.left),top:parseInt(aw[aA(aB,"y")-1].p2c(+aB.y)+q.top)}};aq.shutdown=ag;aq.resize=function(){B();g(az);g(ad)};aq.hooks=ak;F(aq);Z(J);X();aj(ai);t();W();ah();function an(aD,aB){aB=[aq].concat(aB);for(var aC=0;aC=O.colors.length){aG=0;++aF}}var aH=0,aN;for(aG=0;aGa3.datamax&&a1!=aB){a3.datamax=a1}}c.each(m(),function(a1,a2){a2.datamin=aO;a2.datamax=aI;a2.used=false});for(aU=0;aU0&&aT[aR-aP]!=null&&aT[aR-aP]!=aT[aR]&&aT[aR-aP+1]!=aT[aR+1]){for(aN=0;aNaM){aM=a0}}if(aX.y){if(a0aV){aV=a0}}}}if(aJ.bars.show){var aY=aJ.bars.align=="left"?0:-aJ.bars.barWidth/2;if(aJ.bars.horizontal){aQ+=aY;aV+=aY+aJ.bars.barWidth}else{aK+=aY;aM+=aY+aJ.bars.barWidth}}aF(aJ.xaxis,aK,aM);aF(aJ.yaxis,aQ,aV)}c.each(m(),function(a1,a2){if(a2.datamin==aO){a2.datamin=null}if(a2.datamax==aI){a2.datamax=null}})}function j(aB,aC){var aD=document.createElement("canvas");aD.className=aC;aD.width=G;aD.height=I;if(!aB){c(aD).css({position:"absolute",left:0,top:0})}c(aD).appendTo(av);if(!aD.getContext){aD=window.G_vmlCanvasManager.initElement(aD)}aD.getContext("2d").save();return aD}function B(){G=av.width();I=av.height();if(G<=0||I<=0){throw"Invalid dimensions for plot, width = "+G+", height = "+I}}function g(aC){if(aC.width!=G){aC.width=G}if(aC.height!=I){aC.height=I}var aB=aC.getContext("2d");aB.restore();aB.save()}function X(){var aC,aB=av.children("canvas.base"),aD=av.children("canvas.overlay");if(aB.length==0||aD==0){av.html("");av.css({padding:0});if(av.css("position")=="static"){av.css("position","relative")}B();az=j(true,"base");ad=j(false,"overlay");aC=false}else{az=aB.get(0);ad=aD.get(0);aC=true}H=az.getContext("2d");A=ad.getContext("2d");y=c([ad,az]);if(aC){av.data("plot").shutdown();aq.resize();A.clearRect(0,0,G,I);y.unbind();av.children().not([az,ad]).remove()}av.data("plot",aq)}function ah(){if(O.grid.hoverable){y.mousemove(aa);y.mouseleave(l)}if(O.grid.clickable){y.click(R)}an(ak.bindEvents,[y])}function ag(){if(M){clearTimeout(M)}y.unbind("mousemove",aa);y.unbind("mouseleave",l);y.unbind("click",R);an(ak.shutdown,[y])}function r(aG){function aC(aH){return aH}var aF,aB,aD=aG.options.transform||aC,aE=aG.options.inverseTransform;if(aG.direction=="x"){aF=aG.scale=h/Math.abs(aD(aG.max)-aD(aG.min));aB=Math.min(aD(aG.max),aD(aG.min))}else{aF=aG.scale=w/Math.abs(aD(aG.max)-aD(aG.min));aF=-aF;aB=Math.max(aD(aG.max),aD(aG.min))}if(aD==aC){aG.p2c=function(aH){return(aH-aB)*aF}}else{aG.p2c=function(aH){return(aD(aH)-aB)*aF}}if(!aE){aG.c2p=function(aH){return aB+aH/aF}}else{aG.c2p=function(aH){return aE(aB+aH/aF)}}}function L(aD){var aB=aD.options,aF,aJ=aD.ticks||[],aI=[],aE,aK=aB.labelWidth,aG=aB.labelHeight,aC;function aH(aM,aL){return c('
'+aM.join("")+"
").appendTo(av)}if(aD.direction=="x"){if(aK==null){aK=Math.floor(G/(aJ.length>0?aJ.length:1))}if(aG==null){aI=[];for(aF=0;aF'+aE+"")}}if(aI.length>0){aI.push('
');aC=aH(aI,"width:10000px;");aG=aC.height();aC.remove()}}}else{if(aK==null||aG==null){for(aF=0;aF'+aE+"")}}if(aI.length>0){aC=aH(aI,"");if(aK==null){aK=aC.children().width()}if(aG==null){aG=aC.find("div.tickLabel").height()}aC.remove()}}}if(aK==null){aK=0}if(aG==null){aG=0}aD.labelWidth=aK;aD.labelHeight=aG}function au(aD){var aC=aD.labelWidth,aL=aD.labelHeight,aH=aD.options.position,aF=aD.options.tickLength,aG=O.grid.axisMargin,aJ=O.grid.labelMargin,aK=aD.direction=="x"?p:aw,aE;var aB=c.grep(aK,function(aN){return aN&&aN.options.position==aH&&aN.reserveSpace});if(c.inArray(aD,aB)==aB.length-1){aG=0}if(aF==null){aF="full"}var aI=c.grep(aK,function(aN){return aN&&aN.reserveSpace});var aM=c.inArray(aD,aI)==0;if(!aM&&aF=="full"){aF=5}if(!isNaN(+aF)){aJ+=+aF}if(aD.direction=="x"){aL+=aJ;if(aH=="bottom"){q.bottom+=aL+aG;aD.box={top:I-q.bottom,height:aL}}else{aD.box={top:q.top+aG,height:aL};q.top+=aL+aG}}else{aC+=aJ;if(aH=="left"){aD.box={left:q.left+aG,width:aC};q.left+=aC+aG}else{q.right+=aC+aG;aD.box={left:G-q.right,width:aC}}}aD.position=aH;aD.tickLength=aF;aD.box.padding=aJ;aD.innermost=aM}function U(aB){if(aB.direction=="x"){aB.box.left=q.left;aB.box.width=h}else{aB.box.top=q.top;aB.box.height=w}}function t(){var aC,aE=m();c.each(aE,function(aF,aG){aG.show=aG.options.show;if(aG.show==null){aG.show=aG.used}aG.reserveSpace=aG.show||aG.options.reserveSpace;n(aG)});allocatedAxes=c.grep(aE,function(aF){return aF.reserveSpace});q.left=q.right=q.top=q.bottom=0;if(O.grid.show){c.each(allocatedAxes,function(aF,aG){S(aG);P(aG);ap(aG,aG.ticks);L(aG)});for(aC=allocatedAxes.length-1;aC>=0;--aC){au(allocatedAxes[aC])}var aD=O.grid.minBorderMargin;if(aD==null){aD=0;for(aC=0;aC=0){aD=0}}if(aF.max==null){aB+=aH*aG;if(aB>0&&aE.datamax!=null&&aE.datamax<=0){aB=0}}}}aE.min=aD;aE.max=aB}function S(aG){var aM=aG.options;var aH;if(typeof aM.ticks=="number"&&aM.ticks>0){aH=aM.ticks}else{aH=0.3*Math.sqrt(aG.direction=="x"?G:I)}var aT=(aG.max-aG.min)/aH,aO,aB,aN,aR,aS,aQ,aI;if(aM.mode=="time"){var aJ={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var aK=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var aC=0;if(aM.minTickSize!=null){if(typeof aM.tickSize=="number"){aC=aM.tickSize}else{aC=aM.minTickSize[0]*aJ[aM.minTickSize[1]]}}for(var aS=0;aS=aC){break}}aO=aK[aS][0];aN=aK[aS][1];if(aN=="year"){aQ=Math.pow(10,Math.floor(Math.log(aT/aJ.year)/Math.LN10));aI=(aT/aJ.year)/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ}aG.tickSize=aM.tickSize||[aO,aN];aB=function(aX){var a2=[],a0=aX.tickSize[0],a3=aX.tickSize[1],a1=new Date(aX.min);var aW=a0*aJ[a3];if(a3=="second"){a1.setUTCSeconds(a(a1.getUTCSeconds(),a0))}if(a3=="minute"){a1.setUTCMinutes(a(a1.getUTCMinutes(),a0))}if(a3=="hour"){a1.setUTCHours(a(a1.getUTCHours(),a0))}if(a3=="month"){a1.setUTCMonth(a(a1.getUTCMonth(),a0))}if(a3=="year"){a1.setUTCFullYear(a(a1.getUTCFullYear(),a0))}a1.setUTCMilliseconds(0);if(aW>=aJ.minute){a1.setUTCSeconds(0)}if(aW>=aJ.hour){a1.setUTCMinutes(0)}if(aW>=aJ.day){a1.setUTCHours(0)}if(aW>=aJ.day*4){a1.setUTCDate(1)}if(aW>=aJ.year){a1.setUTCMonth(0)}var a5=0,a4=Number.NaN,aY;do{aY=a4;a4=a1.getTime();a2.push(a4);if(a3=="month"){if(a0<1){a1.setUTCDate(1);var aV=a1.getTime();a1.setUTCMonth(a1.getUTCMonth()+1);var aZ=a1.getTime();a1.setTime(a4+a5*aJ.hour+(aZ-aV)*a0);a5=a1.getUTCHours();a1.setUTCHours(0)}else{a1.setUTCMonth(a1.getUTCMonth()+a0)}}else{if(a3=="year"){a1.setUTCFullYear(a1.getUTCFullYear()+a0)}else{a1.setTime(a4+aW)}}}while(a4aU){aP=aU}aQ=Math.pow(10,-aP);aI=aT/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2;if(aI>2.25&&(aU==null||aP+1<=aU)){aO=2.5;++aP}}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ;if(aM.minTickSize!=null&&aO0){if(aM.min==null){aG.min=Math.min(aG.min,aL[0])}if(aM.max==null&&aL.length>1){aG.max=Math.max(aG.max,aL[aL.length-1])}}aB=function(aX){var aY=[],aV,aW;for(aW=0;aW1&&/\..*0$/.test((aD[1]-aD[0]).toFixed(aE)))){aG.tickDecimals=aE}}}}aG.tickGenerator=aB;if(c.isFunction(aM.tickFormatter)){aG.tickFormatter=function(aV,aW){return""+aM.tickFormatter(aV,aW)}}else{aG.tickFormatter=aR}}function P(aF){var aH=aF.options.ticks,aG=[];if(aH==null||(typeof aH=="number"&&aH>0)){aG=aF.tickGenerator(aF)}else{if(aH){if(c.isFunction(aH)){aG=aH({min:aF.min,max:aF.max})}else{aG=aH}}}var aE,aB;aF.ticks=[];for(aE=0;aE1){aC=aD[1]}}else{aB=+aD}if(aC==null){aC=aF.tickFormatter(aB,aF)}if(!isNaN(aB)){aF.ticks.push({v:aB,label:aC})}}}function ap(aB,aC){if(aB.options.autoscaleMargin&&aC.length>0){if(aB.options.min==null){aB.min=Math.min(aB.min,aC[0].v)}if(aB.options.max==null&&aC.length>1){aB.max=Math.max(aB.max,aC[aC.length-1].v)}}}function W(){H.clearRect(0,0,G,I);var aC=O.grid;if(aC.show&&aC.backgroundColor){N()}if(aC.show&&!aC.aboveData){ac()}for(var aB=0;aBaG){var aC=aH;aH=aG;aG=aC}return{from:aH,to:aG,axis:aE}}function N(){H.save();H.translate(q.left,q.top);H.fillStyle=am(O.grid.backgroundColor,w,0,"rgba(255, 255, 255, 0)");H.fillRect(0,0,h,w);H.restore()}function ac(){var aF;H.save();H.translate(q.left,q.top);var aH=O.grid.markings;if(aH){if(c.isFunction(aH)){var aK=aq.getAxes();aK.xmin=aK.xaxis.min;aK.xmax=aK.xaxis.max;aK.ymin=aK.yaxis.min;aK.ymax=aK.yaxis.max;aH=aH(aK)}for(aF=0;aFaC.axis.max||aI.toaI.axis.max){continue}aC.from=Math.max(aC.from,aC.axis.min);aC.to=Math.min(aC.to,aC.axis.max);aI.from=Math.max(aI.from,aI.axis.min);aI.to=Math.min(aI.to,aI.axis.max);if(aC.from==aC.to&&aI.from==aI.to){continue}aC.from=aC.axis.p2c(aC.from);aC.to=aC.axis.p2c(aC.to);aI.from=aI.axis.p2c(aI.from);aI.to=aI.axis.p2c(aI.to);if(aC.from==aC.to||aI.from==aI.to){H.beginPath();H.strokeStyle=aD.color||O.grid.markingsColor;H.lineWidth=aD.lineWidth||O.grid.markingsLineWidth;H.moveTo(aC.from,aI.from);H.lineTo(aC.to,aI.to);H.stroke()}else{H.fillStyle=aD.color||O.grid.markingsColor;H.fillRect(aC.from,aI.to,aC.to-aC.from,aI.from-aI.to)}}}var aK=m(),aM=O.grid.borderWidth;for(var aE=0;aEaB.max||(aQ=="full"&&aM>0&&(aO==aB.min||aO==aB.max))){continue}if(aB.direction=="x"){aN=aB.p2c(aO);aJ=aQ=="full"?-w:aQ;if(aB.position=="top"){aJ=-aJ}}else{aL=aB.p2c(aO);aP=aQ=="full"?-h:aQ;if(aB.position=="left"){aP=-aP}}if(H.lineWidth==1){if(aB.direction=="x"){aN=Math.floor(aN)+0.5}else{aL=Math.floor(aL)+0.5}}H.moveTo(aN,aL);H.lineTo(aN+aP,aL+aJ)}H.stroke()}if(aM){H.lineWidth=aM;H.strokeStyle=O.grid.borderColor;H.strokeRect(-aM/2,-aM/2,h+aM,w+aM)}H.restore()}function k(){av.find(".tickLabels").remove();var aG=['
'];var aJ=m();for(var aD=0;aD');for(var aE=0;aEaC.max){continue}var aK={},aI;if(aC.direction=="x"){aI="center";aK.left=Math.round(q.left+aC.p2c(aH.v)-aC.labelWidth/2);if(aC.position=="bottom"){aK.top=aF.top+aF.padding}else{aK.bottom=I-(aF.top+aF.height-aF.padding)}}else{aK.top=Math.round(q.top+aC.p2c(aH.v)-aC.labelHeight/2);if(aC.position=="left"){aK.right=G-(aF.left+aF.width-aF.padding);aI="right"}else{aK.left=aF.left+aF.padding;aI="left"}}aK.width=aC.labelWidth;var aB=["position:absolute","text-align:"+aI];for(var aL in aK){aB.push(aL+":"+aK[aL]+"px")}aG.push('
'+aH.label+"
")}aG.push("
")}aG.push("");av.append(aG.join(""))}function d(aB){if(aB.lines.show){at(aB)}if(aB.bars.show){e(aB)}if(aB.points.show){ao(aB)}}function at(aE){function aD(aP,aQ,aI,aU,aT){var aV=aP.points,aJ=aP.pointsize,aN=null,aM=null;H.beginPath();for(var aO=aJ;aO=aR&&aS>aT.max){if(aR>aT.max){continue}aL=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aS=aT.max}else{if(aR>=aS&&aR>aT.max){if(aS>aT.max){continue}aK=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aR=aT.max}}if(aL<=aK&&aL=aK&&aL>aU.max){if(aK>aU.max){continue}aS=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aL=aU.max}else{if(aK>=aL&&aK>aU.max){if(aL>aU.max){continue}aR=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aK=aU.max}}if(aL!=aN||aS!=aM){H.moveTo(aU.p2c(aL)+aQ,aT.p2c(aS)+aI)}aN=aK;aM=aR;H.lineTo(aU.p2c(aK)+aQ,aT.p2c(aR)+aI)}H.stroke()}function aF(aI,aQ,aP){var aW=aI.points,aV=aI.pointsize,aN=Math.min(Math.max(0,aP.min),aP.max),aX=0,aU,aT=false,aM=1,aL=0,aR=0;while(true){if(aV>0&&aX>aW.length+aV){break}aX+=aV;var aZ=aW[aX-aV],aK=aW[aX-aV+aM],aY=aW[aX],aJ=aW[aX+aM];if(aT){if(aV>0&&aZ!=null&&aY==null){aR=aX;aV=-aV;aM=2;continue}if(aV<0&&aX==aL+aV){H.fill();aT=false;aV=-aV;aM=1;aX=aL=aR+aV;continue}}if(aZ==null||aY==null){continue}if(aZ<=aY&&aZ=aY&&aZ>aQ.max){if(aY>aQ.max){continue}aK=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aZ=aQ.max}else{if(aY>=aZ&&aY>aQ.max){if(aZ>aQ.max){continue}aJ=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aY=aQ.max}}if(!aT){H.beginPath();H.moveTo(aQ.p2c(aZ),aP.p2c(aN));aT=true}if(aK>=aP.max&&aJ>=aP.max){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.max));H.lineTo(aQ.p2c(aY),aP.p2c(aP.max));continue}else{if(aK<=aP.min&&aJ<=aP.min){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.min));H.lineTo(aQ.p2c(aY),aP.p2c(aP.min));continue}}var aO=aZ,aS=aY;if(aK<=aJ&&aK=aP.min){aZ=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.min}else{if(aJ<=aK&&aJ=aP.min){aY=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.min}}if(aK>=aJ&&aK>aP.max&&aJ<=aP.max){aZ=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.max}else{if(aJ>=aK&&aJ>aP.max&&aK<=aP.max){aY=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.max}}if(aZ!=aO){H.lineTo(aQ.p2c(aO),aP.p2c(aK))}H.lineTo(aQ.p2c(aZ),aP.p2c(aK));H.lineTo(aQ.p2c(aY),aP.p2c(aJ));if(aY!=aS){H.lineTo(aQ.p2c(aY),aP.p2c(aJ));H.lineTo(aQ.p2c(aS),aP.p2c(aJ))}}}H.save();H.translate(q.left,q.top);H.lineJoin="round";var aG=aE.lines.lineWidth,aB=aE.shadowSize;if(aG>0&&aB>0){H.lineWidth=aB;H.strokeStyle="rgba(0,0,0,0.1)";var aH=Math.PI/18;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/2),Math.cos(aH)*(aG/2+aB/2),aE.xaxis,aE.yaxis);H.lineWidth=aB/2;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/4),Math.cos(aH)*(aG/2+aB/4),aE.xaxis,aE.yaxis)}H.lineWidth=aG;H.strokeStyle=aE.color;var aC=ae(aE.lines,aE.color,0,w);if(aC){H.fillStyle=aC;aF(aE.datapoints,aE.xaxis,aE.yaxis)}if(aG>0){aD(aE.datapoints,0,0,aE.xaxis,aE.yaxis)}H.restore()}function ao(aE){function aH(aN,aM,aU,aK,aS,aT,aQ,aJ){var aR=aN.points,aI=aN.pointsize;for(var aL=0;aLaT.max||aOaQ.max){continue}H.beginPath();aP=aT.p2c(aP);aO=aQ.p2c(aO)+aK;if(aJ=="circle"){H.arc(aP,aO,aM,0,aS?Math.PI:Math.PI*2,false)}else{aJ(H,aP,aO,aM,aS)}H.closePath();if(aU){H.fillStyle=aU;H.fill()}H.stroke()}}H.save();H.translate(q.left,q.top);var aG=aE.points.lineWidth,aC=aE.shadowSize,aB=aE.points.radius,aF=aE.points.symbol;if(aG>0&&aC>0){var aD=aC/2;H.lineWidth=aD;H.strokeStyle="rgba(0,0,0,0.1)";aH(aE.datapoints,aB,null,aD+aD/2,true,aE.xaxis,aE.yaxis,aF);H.strokeStyle="rgba(0,0,0,0.2)";aH(aE.datapoints,aB,null,aD/2,true,aE.xaxis,aE.yaxis,aF)}H.lineWidth=aG;H.strokeStyle=aE.color;aH(aE.datapoints,aB,ae(aE.points,aE.color),0,false,aE.xaxis,aE.yaxis,aF);H.restore()}function E(aN,aM,aV,aI,aQ,aF,aD,aL,aK,aU,aR,aC){var aE,aT,aJ,aP,aG,aB,aO,aH,aS;if(aR){aH=aB=aO=true;aG=false;aE=aV;aT=aN;aP=aM+aI;aJ=aM+aQ;if(aTaL.max||aPaK.max){return}if(aEaL.max){aT=aL.max;aB=false}if(aJaK.max){aP=aK.max;aO=false}aE=aL.p2c(aE);aJ=aK.p2c(aJ);aT=aL.p2c(aT);aP=aK.p2c(aP);if(aD){aU.beginPath();aU.moveTo(aE,aJ);aU.lineTo(aE,aP);aU.lineTo(aT,aP);aU.lineTo(aT,aJ);aU.fillStyle=aD(aJ,aP);aU.fill()}if(aC>0&&(aG||aB||aO||aH)){aU.beginPath();aU.moveTo(aE,aJ+aF);if(aG){aU.lineTo(aE,aP+aF)}else{aU.moveTo(aE,aP+aF)}if(aO){aU.lineTo(aT,aP+aF)}else{aU.moveTo(aT,aP+aF)}if(aB){aU.lineTo(aT,aJ+aF)}else{aU.moveTo(aT,aJ+aF)}if(aH){aU.lineTo(aE,aJ+aF)}else{aU.moveTo(aE,aJ+aF)}aU.stroke()}}function e(aD){function aC(aJ,aI,aL,aG,aK,aN,aM){var aO=aJ.points,aF=aJ.pointsize;for(var aH=0;aH")}aH.push("");aF=true}if(aN){aJ=aN(aJ,aM)}aH.push('
'+aJ+"")}if(aF){aH.push("")}if(aH.length==0){return}var aL=''+aH.join("")+"
";if(O.legend.container!=null){c(O.legend.container).html(aL)}else{var aI="",aC=O.legend.position,aD=O.legend.margin;if(aD[0]==null){aD=[aD,aD]}if(aC.charAt(0)=="n"){aI+="top:"+(aD[1]+q.top)+"px;"}else{if(aC.charAt(0)=="s"){aI+="bottom:"+(aD[1]+q.bottom)+"px;"}}if(aC.charAt(1)=="e"){aI+="right:"+(aD[0]+q.right)+"px;"}else{if(aC.charAt(1)=="w"){aI+="left:"+(aD[0]+q.left)+"px;"}}var aK=c('
'+aL.replace('style="','style="position:absolute;'+aI+";")+"
").appendTo(av);if(O.legend.backgroundOpacity!=0){var aG=O.legend.backgroundColor;if(aG==null){aG=O.grid.backgroundColor;if(aG&&typeof aG=="string"){aG=c.color.parse(aG)}else{aG=c.color.extract(aK,"background-color")}aG.a=1;aG=aG.toString()}var aB=aK.children();c('
').prependTo(aK).css("opacity",O.legend.backgroundOpacity)}}}var ab=[],M=null;function K(aI,aG,aD){var aO=O.grid.mouseActiveRadius,a0=aO*aO+1,aY=null,aR=false,aW,aU;for(aW=Q.length-1;aW>=0;--aW){if(!aD(Q[aW])){continue}var aP=Q[aW],aH=aP.xaxis,aF=aP.yaxis,aV=aP.datapoints.points,aT=aP.datapoints.pointsize,aQ=aH.c2p(aI),aN=aF.c2p(aG),aC=aO/aH.scale,aB=aO/aF.scale;if(aH.options.inverseTransform){aC=Number.MAX_VALUE}if(aF.options.inverseTransform){aB=Number.MAX_VALUE}if(aP.lines.show||aP.points.show){for(aU=0;aUaC||aK-aQ<-aC||aJ-aN>aB||aJ-aN<-aB){continue}var aM=Math.abs(aH.p2c(aK)-aI),aL=Math.abs(aF.p2c(aJ)-aG),aS=aM*aM+aL*aL;if(aS=Math.min(aZ,aK)&&aN>=aJ+aE&&aN<=aJ+aX):(aQ>=aK+aE&&aQ<=aK+aX&&aN>=Math.min(aZ,aJ)&&aN<=Math.max(aZ,aJ))){aY=[aW,aU/aT]}}}}if(aY){aW=aY[0];aU=aY[1];aT=Q[aW].datapoints.pointsize;return{datapoint:Q[aW].datapoints.points.slice(aU*aT,(aU+1)*aT),dataIndex:aU,series:Q[aW],seriesIndex:aW}}return null}function aa(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return aC.hoverable!=false})}}function l(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return false})}}function R(aB){u("plotclick",aB,function(aC){return aC.clickable!=false})}function u(aC,aB,aD){var aE=y.offset(),aH=aB.pageX-aE.left-q.left,aF=aB.pageY-aE.top-q.top,aJ=C({left:aH,top:aF});aJ.pageX=aB.pageX;aJ.pageY=aB.pageY;var aK=K(aH,aF,aD);if(aK){aK.pageX=parseInt(aK.series.xaxis.p2c(aK.datapoint[0])+aE.left+q.left);aK.pageY=parseInt(aK.series.yaxis.p2c(aK.datapoint[1])+aE.top+q.top)}if(O.grid.autoHighlight){for(var aG=0;aGaH.max||aIaG.max){return}var aF=aE.points.radius+aE.points.lineWidth/2;A.lineWidth=aF;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aB=1.5*aF,aC=aH.p2c(aC),aI=aG.p2c(aI);A.beginPath();if(aE.points.symbol=="circle"){A.arc(aC,aI,aB,0,2*Math.PI,false)}else{aE.points.symbol(A,aC,aI,aB,false)}A.closePath();A.stroke()}function v(aE,aB){A.lineWidth=aE.bars.lineWidth;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aD=c.color.parse(aE.color).scale("a",0.5).toString();var aC=aE.bars.align=="left"?0:-aE.bars.barWidth/2;E(aB[0],aB[1],aB[2]||0,aC,aC+aE.bars.barWidth,0,function(){return aD},aE.xaxis,aE.yaxis,A,aE.bars.horizontal,aE.bars.lineWidth)}function am(aJ,aB,aH,aC){if(typeof aJ=="string"){return aJ}else{var aI=H.createLinearGradient(0,aH,0,aB);for(var aE=0,aD=aJ.colors.length;aE12){n=n-12}else{if(n==0){n=12}}}for(var g=0;g + + + + criterion report + + + + + + + + +
+
+

criterion performance measurements

+ +

overview

+ +

want to understand this report?

+ +
+ +{{#report}} +

{{name}}

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
lower boundestimateupper bound
Mean execution time{{anMean.estLowerBound}}{{anMean.estPoint}}{{anMean.estUpperBound}}
Standard deviation{{anStdDev.estLowerBound}}{{anStdDev.estPoint}}{{anStdDev.estUpperBound}}
+ + +

Outlying measurements have {{anOutlierVar.ovDesc}} + ({{anOutlierVar.ovFraction}}%) + effect on estimated standard deviation.

+
+{{/report}} + +

understanding this report

+ +

In this report, each function benchmarked by criterion is assigned + a section of its own. In each section, we display two charts, each + with an x axis that represents measured execution time. + These charts are active; if you hover your mouse over data points + and annotations, you will see more details.

+ +
    +
  • The chart on the left is a + kernel + density estimate (also known as a KDE) of time + measurements. This graphs the probability of any given time + measurement occurring. A spike indicates that a measurement of a + particular time occurred; its height indicates how often that + measurement was repeated.
  • + +
  • The chart on the right is the raw data from which the kernel + density estimate is built. Measurements are displayed on + the y axis in the order in which they occurred.
  • +
+ +

Under the charts is a small table displaying the mean and standard + deviation of the measurements. We use a statistical technique + called + the bootstrap + to provide confidence intervals on our estimates of these values. + The bootstrap-derived upper and lower bounds on the mean and + standard deviation let you see how accurate we believe those + estimates to be. (Hover the mouse over the table headers to see + the confidence levels.)

+ +

A noisy benchmarking environment can cause some or many + measurements to fall far from the mean. These outlying + measurements can have a significant inflationary effect on the + estimate of the standard deviation. We calculate and display an + estimate of the extent to which the standard deviation has been + inflated by outliers.

+ + + +
+
+ + +