Charts can be empty when values are all identical
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Jan 2018 04:46:45 +0000 (04:46 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Jan 2018 04:46:45 +0000 (04:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=181828

Reviewed by Alexey Proskuryakov.

Fixed the bug that when SampleVarianceUpperTriangularMatrix can store -Infinity as the initial cost
of some entries when the sample standard deviation between two points turns out to be 0,
and cause splitIntoSegmentsUntilGoodEnough to return undefiend because no segmentation has a finite cost.

Also fixed the bug that the time series chart fails to show any data points when all data points have
identical values as the entire y-coordinate gets collapsed to an empty value range by adjusting the max value
when min & max values are identical.

* public/v3/components/time-series-chart.js:
(TimeSeriesChart.prototype._ensureValueRangeCache): Raise the max slightly when min & max are identical
to avoid the chart becoming empty. Otherwise valueDiff in _computeVerticalRenderingMetrics becomes 0
and value-to-y-coordinate conversion always results in NaN.
* public/shared/statistics.js:
(Statistics..SampleVarianceUpperTriangularMatrix):
* unit-tests/statistics-tests.js: Added a test case.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@227182 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Websites/perf.webkit.org/ChangeLog
Websites/perf.webkit.org/public/shared/statistics.js
Websites/perf.webkit.org/public/v3/components/time-series-chart.js
Websites/perf.webkit.org/unit-tests/statistics-tests.js

index 655ded8..e88c640 100644 (file)
@@ -1,5 +1,28 @@
 2018-01-18  Ryosuke Niwa  <rniwa@webkit.org>
 
+        Charts can be empty when values are all identical
+        https://bugs.webkit.org/show_bug.cgi?id=181828
+
+        Reviewed by Alexey Proskuryakov.
+
+        Fixed the bug that when SampleVarianceUpperTriangularMatrix can store -Infinity as the initial cost
+        of some entries when the sample standard deviation between two points turns out to be 0,
+        and cause splitIntoSegmentsUntilGoodEnough to return undefiend because no segmentation has a finite cost.
+
+        Also fixed the bug that the time series chart fails to show any data points when all data points have
+        identical values as the entire y-coordinate gets collapsed to an empty value range by adjusting the max value
+        when min & max values are identical.
+
+        * public/v3/components/time-series-chart.js:
+        (TimeSeriesChart.prototype._ensureValueRangeCache): Raise the max slightly when min & max are identical
+        to avoid the chart becoming empty. Otherwise valueDiff in _computeVerticalRenderingMetrics becomes 0
+        and value-to-y-coordinate conversion always results in NaN.
+        * public/shared/statistics.js:
+        (Statistics..SampleVarianceUpperTriangularMatrix):
+        * unit-tests/statistics-tests.js: Added a test case.
+
+2018-01-18  Ryosuke Niwa  <rniwa@webkit.org>
+
         Don't fetch more than two builds to check duplicity of builds in ReportProcessor
         https://bugs.webkit.org/show_bug.cgi?id=181786
 
index 8bcdbd0..c231a1e 100644 (file)
@@ -394,7 +394,7 @@ var Statistics = new (function () {
                 squareSum += currentValue * currentValue;
                 var sampleSize = j - i + 1;
                 var stdev = Statistics.sampleStandardDeviation(sampleSize, sum, squareSum);
-                costMatrix[i][j - i - 1] = sampleSize * Math.log1p(stdev * stdev - 1);
+                costMatrix[i][j - i - 1] = stdev > 0 ? sampleSize * Math.log(stdev * stdev) : 0;
             }
         }
         this.costMatrix = costMatrix;
index e9ef0f9..2b42bfd 100644 (file)
@@ -585,6 +585,8 @@ class TimeSeriesChart extends ComponentBase {
                 max = (max === undefined) ? maxCandidate : Math.max(max, maxCandidate);
             }
         }
+        if (min == max)
+            max = max * 1.1;
         this._valueRangeCache = [min, max];
         Instrumentation.endMeasuringTime('TimeSeriesChart', 'valueRangeCache');
 
index 331aad3..d564471 100644 (file)
@@ -380,5 +380,12 @@ describe('Statistics', function () {
                 5722.87, 5726.8, 5779.23, 5772.2, 5763.1, 5807.05];
             assert.deepEqual(Statistics.segmentTimeSeriesByMaximizingSchwarzCriterion(values), [0, values.length]);
         });
+
+        it('should not segment time series for platform=51 metric=4817 betweeen 1453926047749 and 1454635479052 into multiple parts', function () {
+            var values = new Array(37);
+            for (let i = 0; i < 37; i++)
+                values[i] = 1;
+            assert.deepEqual(Statistics.segmentTimeSeriesByMaximizingSchwarzCriterion(values), [ 0, 6, 16, 26, 37 ]);
+        });
     });
 });