@@ -34,6 +34,10 @@ function shouldPlotEquidistant() {
3434 return $ ( "#equidistant" ) . is ( ':checked' ) ;
3535}
3636
37+ function shouldPlotErrorBars ( ) {
38+ return $ ( "#show_error_bars" ) . is ( ':checked' ) ;
39+ }
40+
3741function shouldPlotQuartiles ( ) {
3842 return $ ( "#show_quartile_bands" ) . is ( ':checked' ) ;
3943}
@@ -50,6 +54,7 @@ function getConfiguration() {
5054 env : $ ( "input[name='environments']:checked" ) . val ( ) ,
5155 revs : $ ( "#revisions option:selected" ) . val ( ) ,
5256 equid : $ ( "#equidistant" ) . is ( ':checked' ) ? "on" : "off" ,
57+ error : $ ( "#show_error_bars" ) . is ( ':checked' ) ? "on" : "off" ,
5358 quarts : $ ( "#show_quartile_bands" ) . is ( ':checked' ) ? "on" : "off" ,
5459 extr : $ ( "#show_extrema_bands" ) . is ( ':checked' ) ? "on" : "off"
5560 } ;
@@ -98,13 +103,34 @@ function getHighlighterConfig(median) {
98103function renderPlot ( data ) {
99104 var plotdata = [ ] ,
100105 series = [ ] ,
106+ firstdates = [ ] ,
107+ lastdates = [ ] ,
101108 lastvalues = [ ] ; //hopefully the smallest values for determining significant digits.
102109 seriesindex = [ ] ;
110+ var errorSeries = 0 ;
103111 var hiddenSeries = 0 ;
112+ var mean = data [ 'data_type' ] === 'U' ;
104113 var median = data [ 'data_type' ] === 'M' ;
105114 for ( var branch in data . branches ) {
106115 // NOTE: Currently, only the "default" branch is shown in the timeline
107116 for ( var exe_id in data . branches [ branch ] ) {
117+ if ( mean ) {
118+ $ ( "span.options.mean" ) . css ( "display" , "inline" ) ;
119+ if ( shouldPlotErrorBars ( ) ) {
120+ marker = false ;
121+ var error = new Array ( ) ;
122+ for ( res in data [ "branches" ] [ branch ] [ exe_id ] ) {
123+ var date = data [ "branches" ] [ branch ] [ exe_id ] [ res ] [ 0 ] ;
124+ var value = data [ "branches" ] [ branch ] [ exe_id ] [ res ] [ 1 ] ;
125+ var std_dev = data [ "branches" ] [ branch ] [ exe_id ] [ res ] [ 2 ] ;
126+ error . push ( [ date , value - std_dev , value + std_dev , data [ "branches" ] [ branch ] [ exe_id ] [ res ] [ 3 ] ] ) ;
127+ }
128+ plotdata . push ( error ) ;
129+ series . push ( { renderer :$ . jqplot . OHLCRenderer , rendererOptions :{ errorBar :true } , showLabel : false , showMarker : true ,
130+ "label" : $ ( "label[for*='executable" + getColor ( exe_id ) + "']" ) . html ( ) + " error" , color : "#C0C0C0" } ) ;
131+ errorSeries ++ ;
132+ }
133+ }
108134 // FIXME if (branch !== "default") { label += " - " + branch; }
109135 var label = $ ( "label[for*='executable" + exe_id + "']" ) . html ( ) ;
110136 var seriesConfig = {
@@ -153,8 +179,15 @@ function renderPlot(data) {
153179 }
154180 series . push ( seriesConfig ) ;
155181 seriesindex . push ( exe_id ) ;
156- plotdata . push ( data . branches [ branch ] [ exe_id ] ) ;
157- lastvalues . push ( data . branches [ branch ] [ exe_id ] [ 0 ] [ 1 ] ) ;
182+ var exeData = data . branches [ branch ] [ exe_id ] ;
183+ plotdata . push ( exeData ) ;
184+ var startDate = new Date ( exeData [ exeData . length - 1 ] [ 0 ] )
185+ var endDate = new Date ( exeData [ 0 ] [ 0 ] ) ;
186+ startDate . setDate ( startDate . getDate ( ) - 1 ) ;
187+ endDate . setDate ( endDate . getDate ( ) + 1 ) ;
188+ firstdates . push ( startDate ) ;
189+ lastdates . push ( endDate ) ;
190+ lastvalues . push ( exeData [ 0 ] [ 1 ] ) ;
158191 }
159192 //determine significant digits
160193 var digits = 2 ;
@@ -202,7 +235,8 @@ function renderPlot(data) {
202235 labelRenderer : $ . jqplot . CanvasAxisLabelRenderer ,
203236 tickOptions : { formatString :'%b %d' } ,
204237 pad : 1.01 ,
205- autoscale : true ,
238+ min : Math . min . apply ( Math , firstdates ) ,
239+ max : Math . max . apply ( Math , lastdates ) ,
206240 rendererOptions : { sortMergedLabels :true } /* only relevant when
207241 $.jqplot.CategoryAxisRenderer is used */
208242 }
@@ -211,7 +245,7 @@ function renderPlot(data) {
211245 highlighter : getHighlighterConfig ( median ) ,
212246 cursor : { show :true , zoom :true , showTooltip :false , clickReset :true }
213247 } ;
214- if ( series . length > 4 + hiddenSeries ) {
248+ if ( series . length > 4 + errorSeries + hiddenSeries ) {
215249 // Move legend outside plot area to unclutter
216250 var labels = [ ] ;
217251 for ( var l in series ) {
@@ -231,14 +265,23 @@ function renderPlot(data) {
231265
232266function renderMiniplot ( plotid , data ) {
233267 var plotdata = [ ] ,
234- series = [ ] ;
268+ series = [ ] ,
269+ firstdates = [ ] ,
270+ lastdates = [ ] ;
235271
236272 for ( var branch in data . branches ) {
237273 for ( var id in data . branches [ branch ] ) {
238274 series . push ( {
239275 "label" : $ ( "label[for*='executable" + id + "']" ) . html ( ) ,
240276 "color" : getColor ( id )
241277 } ) ;
278+ var exeData = data . branches [ branch ] [ id ] ;
279+ var startDate = new Date ( exeData [ exeData . length - 1 ] [ 0 ] )
280+ var endDate = new Date ( exeData [ 0 ] [ 0 ] ) ;
281+ startDate . setDate ( startDate . getDate ( ) - 1 ) ;
282+ endDate . setDate ( endDate . getDate ( ) + 1 ) ;
283+ firstdates . push ( startDate ) ;
284+ lastdates . push ( endDate ) ;
242285 plotdata . push ( data . branches [ branch ] [ id ] ) ;
243286 }
244287 }
@@ -268,7 +311,10 @@ function renderMiniplot(plotid, data) {
268311 renderer :$ . jqplot . DateAxisRenderer ,
269312 pad : 1.01 ,
270313 autoscale :true ,
271- showTicks : false
314+ showTicks : false ,
315+ min : Math . min . apply ( Math , firstdates ) ,
316+ max : Math . max . apply ( Math , lastdates ) ,
317+ rendererOptions : { sortMergedLabels :true }
272318 }
273319 } ,
274320 highlighter : { show :false } ,
@@ -280,6 +326,7 @@ function renderMiniplot(plotid, data) {
280326function render ( data ) {
281327 $ ( "#revisions" ) . attr ( "disabled" , false ) ;
282328 $ ( "#equidistant" ) . attr ( "disabled" , false ) ;
329+ $ ( "span.options.mean" ) . css ( "display" , "none" ) ;
283330 $ ( "span.options.median" ) . css ( "display" , "none" ) ;
284331 $ ( "#plotgrid" ) . html ( "" ) ;
285332 if ( data . error !== "None" ) {
@@ -342,6 +389,7 @@ function initializeSite(event) {
342389 $ ( "input[name='benchmark']" ) . change ( updateUrl ) ;
343390 $ ( "input[name='environments']" ) . change ( updateUrl ) ;
344391 $ ( "#equidistant" ) . change ( updateUrl ) ;
392+ $ ( "#show_error_bars" ) . change ( updateUrl ) ;
345393 $ ( "#show_quartile_bands" ) . change ( updateUrl ) ;
346394 $ ( "#show_extrema_bands" ) . change ( updateUrl ) ;
347395}
@@ -397,6 +445,7 @@ function setValuesOfInputFields(event) {
397445
398446 $ ( "#baselinecolor" ) . css ( "background-color" , baselineColor ) ;
399447 $ ( "#equidistant" ) . prop ( 'checked' , valueOrDefault ( event . parameters . equid , defaults . equidistant ) === "on" ) ;
448+ $ ( "#show_error_bars" ) . prop ( 'checked' , valueOrDefault ( event . parameters . error , defaults . error ) === "on" ) ;
400449 $ ( "#show_quartile_bands" ) . prop ( 'checked' , valueOrDefault ( event . parameters . quarts , defaults . quartiles ) === "on" ) ;
401450 $ ( "#show_extrema_bands" ) . prop ( 'checked' , valueOrDefault ( event . parameters . extr , defaults . extrema ) === "on" ) ;
402451}
0 commit comments