complexity-0.1.3: Test/Complexity/Chart.hs
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NamedFieldPuns #-}
module Test.Complexity.Chart ( statsToChart
, quickStatsToChart
, showStatsChart
) where
import Graphics.Rendering.Chart
import Graphics.Rendering.Chart.Gtk
import Data.Accessor
import Data.List (intercalate)
import Data.Colour
import Data.Colour.Names
import Test.Complexity.Base ( MeasurementStats(..)
, Stats(..)
)
statsToChart :: [(MeasurementStats, Colour Double)] -> Layout1 Double Double
statsToChart [] = defaultLayout1
statsToChart xs = layout1_title ^= intercalate ", " [msDesc | (MeasurementStats {msDesc}, _) <- xs]
$ layout1_plots ^= concat [map Left $ statsToPlots colour stats | (stats, colour) <- xs]
$ layout1_left_axis .> laxis_title ^= "time (ms)"
$ layout1_bottom_axis .> laxis_title ^= "input size (n)"
$ defaultLayout1
quickStatsToChart :: [MeasurementStats] -> Layout1 Double Double
quickStatsToChart xs = statsToChart $ zip xs $ cycle colours
where colours = [ blue
, red
, green
, darkgoldenrod
, orchid
, sienna
, darkcyan
, olivedrab
, silver
]
statsToPlots :: Colour Double -> MeasurementStats -> [Plot Double Double]
statsToPlots c stats = [ plot_legend ^= [] $ toPlot cpuMinMax
, plot_legend ^= [] $ toPlot cpuMin
, plot_legend ^= [] $ toPlot cpuMax
, toPlot cpuMean
, plot_legend ^= [] $ toPlot cpuErr
, plot_legend ^= [] $ toPlot cpuMeanPts
]
where meanLineColour = opaque c
meanPointColour = opaque $ blend 0.5 c black
stdDevColour = withOpacity c 0.7
minMaxEdgeColour = withOpacity c 0.2
minMaxAreaColour = withOpacity c 0.05
cpuMean = plot_lines_values ^= [zip xs ys_cpuMean2]
$ plot_lines_style .> line_color ^= meanLineColour
$ plot_lines_title ^= msDesc stats
$ defaultPlotLines
cpuMin = plot_lines_values ^= [zip xs ys_cpuMin]
$ plot_lines_style .> line_color ^= minMaxEdgeColour
$ defaultPlotLines
cpuMax = plot_lines_values ^= [zip xs ys_cpuMax]
$ plot_lines_style .> line_color ^= minMaxEdgeColour
$ defaultPlotLines
cpuMeanPts = plot_points_values ^= zip xs ys_cpuMean2
$ plot_points_style ^= filledCircles 2 meanPointColour
$ defaultPlotPoints
cpuMinMax = plot_fillbetween_values ^= zip xs (zip ys_cpuMin ys_cpuMax)
$ plot_fillbetween_style ^= solidFillStyle minMaxAreaColour
$ defaultPlotFillBetween
cpuErr = plot_errbars_values ^= [symErrPoint x y 0 e | (x, y, e) <- zip3 xs ys_cpuMean vs_cpuStdDev]
$ plot_errbars_line_style .> line_color ^= stdDevColour
$ defaultPlotErrBars
ps = msSamples stats
xs = map (fromIntegral . fst) ps
ys_cpuMean = map (statsMean . snd) ps
ys_cpuMean2 = map (statsMean2 . snd) ps
ys_cpuMin = map (statsMin . snd) ps
ys_cpuMax = map (statsMax . snd) ps
vs_cpuStdDev = map (statsStdDev . snd) ps
showStatsChart :: [MeasurementStats] -> IO ()
showStatsChart xs = renderableToWindow (toRenderable $ quickStatsToChart xs) 640 480