WebKit Bugzilla
Attachment 346806 Details for
Bug 188425
: Show t-test results based on individual measurements to analysis task page
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-188425-20180808173231.patch (text/plain), 71.17 KB, created by
dewei_zhu
on 2018-08-08 17:32:32 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
dewei_zhu
Created:
2018-08-08 17:32:32 PDT
Size:
71.17 KB
patch
obsolete
>Subversion Revision: 234587 >diff --git a/Websites/perf.webkit.org/ChangeLog b/Websites/perf.webkit.org/ChangeLog >index c127a5587f90be73002cf528b297fd7075e03025..a51f4d69179c245d26e4ef130b4ab87af5549f0d 100644 >--- a/Websites/perf.webkit.org/ChangeLog >+++ b/Websites/perf.webkit.org/ChangeLog >@@ -1,3 +1,44 @@ >+2018-08-08 Dewei Zhu <dewei_zhu@apple.com> >+ >+ Added comparision for individual iterations on analysis task page. >+ https://bugs.webkit.org/show_bug.cgi?id=188425 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added comparison for individual iterations in analysis task page. >+ Added comparison for individual iterations for notification on A/B tests completion. >+ Refactored t-distribution inverse lookup to any degree of freedom with 4 digit precision. >+ >+ * public/shared/statistics.js: >+ (Statistics.new.this.supportedConfidenceIntervalProbabilities): >+ (Statistics.new.this.supportedOneSideTTestProbabilities): >+ (Statistics.new.this.confidenceIntervalDelta): >+ (Statistics.new.sampleMeanAndVarianceForAggregatedInfo): >+ (Statistics.new.this.probabilityRangeForWelchsT): >+ (Statistics.new.this.probabilityRangeForWelchsTFromAggregatedInfo): >+ (Statistics.new.this._determinetwoSidedProbabilityBoundaryForWelchsT): >+ (Statistics.new.this.computeWelchsT): >+ (Statistics.new.this._combineWelchsT): >+ (Statistics.new.minimumTForOneSidedProbability): >+ * public/v3/components/analysis-results-viewer.js: >+ (AnalysisResultsViewer.TestGroupStackingBlock.prototype._measurementsForCommitSet): >+ (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus): >+ (AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet): Deleted. >+ * public/v3/components/test-group-results-viewer.js: >+ (TestGroupResultsViewer.prototype._renderResultsTable): >+ (TestGroupResultsViewer.prototype._buildRowForMetric.): >+ (TestGroupResultsViewer.prototype._buildValueMap): >+ * public/v3/models/test-group.js: >+ (TestGroup._computeRequestedCommitSets.set requestedCommitSets): >+ (TestGroup._computeRequestedCommitSets.const.set request): >+ (TestGroup._computeRequestedCommitSets): >+ * tools/js/test-group-result-page.js: >+ (TestGroupResultPage.prototype._constructTableForMetric): >+ (TestGroupResultPage.prototype.get styleTemplate): >+ (TestGroupResultPage): >+ (TestGroupResultPage.prototype._URLForAnalysisTask): Renamed to '_resultsForTestGroup' >+ * unit-tests/statistics-tests.js: >+ > 2018-07-13 Dewei Zhu <dewei_zhu@apple.com> > > CustomConfigurationTestGroupForm should dispatch different arguments based on whether analysis task is created. >diff --git a/Websites/perf.webkit.org/public/shared/statistics.js b/Websites/perf.webkit.org/public/shared/statistics.js >index 056ba94f8df77af6d544c76c165607d1d11daed3..5c62b3be47eb03ba1290241ccd42f92271400502 100644 >--- a/Websites/perf.webkit.org/public/shared/statistics.js >+++ b/Websites/perf.webkit.org/public/shared/statistics.js >@@ -34,31 +34,26 @@ var Statistics = new (function () { > > this.supportedConfidenceIntervalProbabilities = function () { > var supportedProbabilities = []; >- for (var probability in tDistributionByOneSidedProbability) >+ for (var probability in tDistributionTable) > supportedProbabilities.push(oneSidedToTwoSidedProbability(probability).toFixed(2)); > return supportedProbabilities > } > > this.supportedOneSideTTestProbabilities = function () { >- return Object.keys(tDistributionByOneSidedProbability); >+ return Object.keys(tDistributionTable); > } > > // Computes the delta d s.t. (mean - d, mean + d) is the confidence interval with the specified probability in O(1). > this.confidenceIntervalDelta = function (probability, numberOfSamples, sum, squareSum) { > var oneSidedProbability = twoSidedToOneSidedProbability(probability); >- if (!(oneSidedProbability in tDistributionByOneSidedProbability)) { >+ if (!(oneSidedProbability in tDistributionTable)) { > throw 'We only support ' + this.supportedConfidenceIntervalProbabilities().map(function (probability) > { return probability * 100 + '%'; } ).join(', ') + ' confidence intervals.'; > } > if (numberOfSamples - 2 < 0) > return NaN; >- var deltas = tDistributionByOneSidedProbability[oneSidedProbability]; >- var degreesOfFreedom = numberOfSamples - 1; >- if (degreesOfFreedom > deltas.length) >- throw 'We only support up to ' + deltas.length + ' degrees of freedom'; >- > // d = c * S/sqrt(numberOfSamples) where c ~ t-distribution(degreesOfFreedom) and S is the sample standard deviation. >- return deltas[degreesOfFreedom - 1] * this.sampleStandardDeviation(numberOfSamples, sum, squareSum) / Math.sqrt(numberOfSamples); >+ return minimumTForOneSidedProbability(oneSidedProbability, numberOfSamples - 1) * this.sampleStandardDeviation(numberOfSamples, sum, squareSum) / Math.sqrt(numberOfSamples); > } > > this.confidenceInterval = function (values, probability) { >@@ -73,41 +68,72 @@ var Statistics = new (function () { > return this.computeWelchsT(values1, 0, values1.length, values2, 0, values2.length, probability).significantlyDifferent; > } > >+ function sampleMeanAndVarianceForAggregatedInfo(statisticalInfo) { >+ let sum = 0; >+ let squareSum = 0; >+ let size = 0; >+ for (const entry of statisticalInfo) { >+ sum += entry.sum; >+ squareSum += entry.squareSum; >+ size += entry.iterationCount; >+ } >+ const mean = sum / size; >+ const unbiasedSampleVariance = (squareSum - sum * sum / size) / (size - 1); >+ return { >+ mean, >+ variance: unbiasedSampleVariance, >+ size, >+ degreesOfFreedom: size - 1, >+ } >+ } >+ > this.probabilityRangeForWelchsT = function (values1, values2) { > var result = this.computeWelchsT(values1, 0, values1.length, values2, 0, values2.length); >- if (isNaN(result.t) || isNaN(result.degreesOfFreedom)) >+ return this._determinetwoSidedProbabilityBoundaryForWelchsT(result.t, result.degreesOfFreedom); >+ } >+ >+ this.probabilityRangeForWelchsTFromAggregatedInfo = function (aggregatedInfo1, aggregatedInfo2) { >+ const stat1 = sampleMeanAndVarianceForAggregatedInfo(aggregatedInfo1); >+ const stat2 = sampleMeanAndVarianceForAggregatedInfo(aggregatedInfo2); >+ const combinedT = this._combineWelchsT(stat1, stat2); >+ return this._determinetwoSidedProbabilityBoundaryForWelchsT(combinedT.t, combinedT.degreesOfFreedom) >+ } >+ >+ this._determinetwoSidedProbabilityBoundaryForWelchsT = function(t, degreesOfFreedom) { >+ if (isNaN(t) || isNaN(degreesOfFreedom)) > return {t: NaN, degreesOfFreedom:NaN, range: [null, null]}; > >- var lowerBound = null; >- var upperBound = null; >- for (var probability in tDistributionByOneSidedProbability) { >+ let lowerBound = null; >+ let upperBound = null; >+ for (var probability in tDistributionTable) { > var twoSidedProbability = oneSidedToTwoSidedProbability(probability); >- if (result.t > tDistributionByOneSidedProbability[probability][Math.round(result.degreesOfFreedom - 1)]) >+ if (t > minimumTForOneSidedProbability(probability, Math.round(degreesOfFreedom))) > lowerBound = twoSidedProbability; > else if (lowerBound) { > upperBound = twoSidedProbability; > break; > } > } >- return {t: result.t, degreesOfFreedom: result.degreesOfFreedom, range: [lowerBound, upperBound]}; >- } >+ return {t, degreesOfFreedom, range: [lowerBound, upperBound]}; >+ }; > > this.computeWelchsT = function (values1, startIndex1, length1, values2, startIndex2, length2, probability) { >- var stat1 = sampleMeanAndVarianceForValues(values1, startIndex1, length1); >- var stat2 = sampleMeanAndVarianceForValues(values2, startIndex2, length2); >- var sumOfSampleVarianceOverSampleSize = stat1.variance / stat1.size + stat2.variance / stat2.size; >- var t = Math.abs((stat1.mean - stat2.mean) / Math.sqrt(sumOfSampleVarianceOverSampleSize)); >+ const stat1 = sampleMeanAndVarianceForValues(values1, startIndex1, length1); >+ const stat2 = sampleMeanAndVarianceForValues(values2, startIndex2, length2); >+ const {t, degreesOfFreedom} = this._combineWelchsT(stat1, stat2); >+ const minT = minimumTForOneSidedProbability(twoSidedToOneSidedProbability(probability || 0.8), Math.round(degreesOfFreedom)); >+ return {t, degreesOfFreedom, significantlyDifferent: t > minT}; >+ }; >+ >+ this._combineWelchsT = function(stat1, stat2) { >+ const sumOfSampleVarianceOverSampleSize = stat1.variance / stat1.size + stat2.variance / stat2.size; >+ const t = Math.abs((stat1.mean - stat2.mean) / Math.sqrt(sumOfSampleVarianceOverSampleSize)); > > // http://en.wikipedia.org/wiki/WelchâSatterthwaite_equation >- var degreesOfFreedom = sumOfSampleVarianceOverSampleSize * sumOfSampleVarianceOverSampleSize >+ const degreesOfFreedom = sumOfSampleVarianceOverSampleSize * sumOfSampleVarianceOverSampleSize > / (stat1.variance * stat1.variance / stat1.size / stat1.size / stat1.degreesOfFreedom > + stat2.variance * stat2.variance / stat2.size / stat2.size / stat2.degreesOfFreedom); >- var minT = tDistributionByOneSidedProbability[twoSidedToOneSidedProbability(probability || 0.8)][Math.round(degreesOfFreedom - 1)]; >- return { >- t: t, >- degreesOfFreedom: degreesOfFreedom, >- significantlyDifferent: t > minT, >- }; >+ return {t, degreesOfFreedom}; > } > > this.findRangesForChangeDetectionsWithWelchsTTest = function (values, segmentations, oneSidedPossibility=0.99) { >@@ -258,56 +284,318 @@ var Statistics = new (function () { > recursivelySplitIntoTwoSegmentsAtMaxTIfSignificantlyDifferent(values, startIndex + argTMax, length - argTMax, minLength, segments); > } > >- var tDistributionByOneSidedProbability = { >+ function minimumTForOneSidedProbability(probability, degreesOfFreedom) { >+ if (degreesOfFreedom < 1 || isNaN(degreesOfFreedom)) >+ return NaN; >+ const tDistributionTableForProbability = tDistributionTable[probability]; >+ let low = 0; >+ let high = tDistributionTableForProbability.length; >+ while (low < high) { >+ let mid = low + parseInt((high - low) / 2); >+ const entry = tDistributionTableForProbability[mid]; >+ if (degreesOfFreedom <= entry.end) >+ high = mid; >+ else >+ low = mid + 1; >+ } >+ >+ return tDistributionTableForProbability[low].value; >+ } >+ >+ const tDistributionTable = { > 0.9: [ >- 3.077684, 1.885618, 1.637744, 1.533206, 1.475884, 1.439756, 1.414924, 1.396815, 1.383029, 1.372184, >- 1.363430, 1.356217, 1.350171, 1.345030, 1.340606, 1.336757, 1.333379, 1.330391, 1.327728, 1.325341, >- 1.323188, 1.321237, 1.319460, 1.317836, 1.316345, 1.314972, 1.313703, 1.312527, 1.311434, 1.310415, >- 1.309464, 1.308573, 1.307737, 1.306952, 1.306212, 1.305514, 1.304854, 1.304230, 1.303639, 1.303077, >- 1.302543, 1.302035, 1.301552, 1.301090, 1.300649, 1.300228, 1.299825, 1.299439, 1.299069, 1.298714, >- >- 1.298373, 1.298045, 1.297730, 1.297426, 1.297134, 1.296853, 1.296581, 1.296319, 1.296066, 1.295821, >- 1.295585, 1.295356, 1.295134, 1.294920, 1.294712, 1.294511, 1.294315, 1.294126, 1.293942, 1.293763, >- 1.293589, 1.293421, 1.293256, 1.293097, 1.292941, 1.292790, 1.292643, 1.292500, 1.292360, 1.292224, >- 1.292091, 1.291961, 1.291835, 1.291711, 1.291591, 1.291473, 1.291358, 1.291246, 1.291136, 1.291029, >- 1.290924, 1.290821, 1.290721, 1.290623, 1.290527, 1.290432, 1.290340, 1.290250, 1.290161, 1.290075], >+ {end: 1, value: 3.0777}, {end: 2, value: 1.8856}, {end: 3, value: 1.6377}, {end: 4, value: 1.5332}, >+ {end: 5, value: 1.4759}, {end: 6, value: 1.4398}, {end: 7, value: 1.4149}, {end: 8, value: 1.3968}, >+ {end: 9, value: 1.3830}, {end: 10, value: 1.3722}, {end: 11, value: 1.3634}, {end: 12, value: 1.3562}, >+ {end: 13, value: 1.3502}, {end: 14, value: 1.3450}, {end: 15, value: 1.3406}, {end: 16, value: 1.3368}, >+ {end: 17, value: 1.3334}, {end: 18, value: 1.3304}, {end: 19, value: 1.3277}, {end: 20, value: 1.3253}, >+ {end: 21, value: 1.3232}, {end: 22, value: 1.3212}, {end: 23, value: 1.3195}, {end: 24, value: 1.3178}, >+ {end: 25, value: 1.3163}, {end: 26, value: 1.3150}, {end: 27, value: 1.3137}, {end: 28, value: 1.3125}, >+ {end: 29, value: 1.3114}, {end: 30, value: 1.3104}, {end: 31, value: 1.3095}, {end: 32, value: 1.3086}, >+ {end: 33, value: 1.3077}, {end: 34, value: 1.3070}, {end: 35, value: 1.3062}, {end: 36, value: 1.3055}, >+ {end: 37, value: 1.3049}, {end: 38, value: 1.3042}, {end: 39, value: 1.3036}, {end: 40, value: 1.3031}, >+ {end: 41, value: 1.3025}, {end: 42, value: 1.3020}, {end: 43, value: 1.3016}, {end: 44, value: 1.3011}, >+ {end: 45, value: 1.3006}, {end: 46, value: 1.3002}, {end: 47, value: 1.2998}, {end: 48, value: 1.2994}, >+ {end: 49, value: 1.2991}, {end: 50, value: 1.2987}, {end: 51, value: 1.2984}, {end: 52, value: 1.2980}, >+ {end: 53, value: 1.2977}, {end: 54, value: 1.2974}, {end: 55, value: 1.2971}, {end: 56, value: 1.2969}, >+ {end: 57, value: 1.2966}, {end: 58, value: 1.2963}, {end: 59, value: 1.2961}, {end: 60, value: 1.2958}, >+ {end: 61, value: 1.2956}, {end: 62, value: 1.2954}, {end: 63, value: 1.2951}, {end: 64, value: 1.2949}, >+ {end: 65, value: 1.2947}, {end: 66, value: 1.2945}, {end: 67, value: 1.2943}, {end: 68, value: 1.2941}, >+ {end: 69, value: 1.2939}, {end: 70, value: 1.2938}, {end: 71, value: 1.2936}, {end: 72, value: 1.2934}, >+ {end: 73, value: 1.2933}, {end: 74, value: 1.2931}, {end: 75, value: 1.2929}, {end: 76, value: 1.2928}, >+ {end: 77, value: 1.2926}, {end: 78, value: 1.2925}, {end: 79, value: 1.2924}, {end: 80, value: 1.2922}, >+ {end: 81, value: 1.2921}, {end: 82, value: 1.2920}, {end: 83, value: 1.2918}, {end: 84, value: 1.2917}, >+ {end: 85, value: 1.2916}, {end: 86, value: 1.2915}, {end: 87, value: 1.2914}, {end: 88, value: 1.2912}, >+ {end: 89, value: 1.2911}, {end: 90, value: 1.2910}, {end: 91, value: 1.2909}, {end: 92, value: 1.2908}, >+ {end: 93, value: 1.2907}, {end: 94, value: 1.2906}, {end: 95, value: 1.2905}, {end: 96, value: 1.2904}, >+ {end: 97, value: 1.2903}, {end: 99, value: 1.2902}, {end: 100, value: 1.2901}, {end: 101, value: 1.2900}, >+ {end: 102, value: 1.2899}, {end: 103, value: 1.2898}, {end: 105, value: 1.2897}, {end: 106, value: 1.2896}, >+ {end: 107, value: 1.2895}, {end: 109, value: 1.2894}, {end: 110, value: 1.2893}, {end: 112, value: 1.2892}, >+ {end: 113, value: 1.2891}, {end: 115, value: 1.2890}, {end: 116, value: 1.2889}, {end: 118, value: 1.2888}, >+ {end: 119, value: 1.2887}, {end: 121, value: 1.2886}, {end: 123, value: 1.2885}, {end: 125, value: 1.2884}, >+ {end: 127, value: 1.2883}, {end: 128, value: 1.2882}, {end: 130, value: 1.2881}, {end: 132, value: 1.2880}, >+ {end: 135, value: 1.2879}, {end: 137, value: 1.2878}, {end: 139, value: 1.2877}, {end: 141, value: 1.2876}, >+ {end: 144, value: 1.2875}, {end: 146, value: 1.2874}, {end: 149, value: 1.2873}, {end: 151, value: 1.2872}, >+ {end: 154, value: 1.2871}, {end: 157, value: 1.2870}, {end: 160, value: 1.2869}, {end: 163, value: 1.2868}, >+ {end: 166, value: 1.2867}, {end: 170, value: 1.2866}, {end: 173, value: 1.2865}, {end: 177, value: 1.2864}, >+ {end: 180, value: 1.2863}, {end: 184, value: 1.2862}, {end: 188, value: 1.2861}, {end: 193, value: 1.2860}, >+ {end: 197, value: 1.2859}, {end: 202, value: 1.2858}, {end: 207, value: 1.2857}, {end: 212, value: 1.2856}, >+ {end: 217, value: 1.2855}, {end: 223, value: 1.2854}, {end: 229, value: 1.2853}, {end: 235, value: 1.2852}, >+ {end: 242, value: 1.2851}, {end: 249, value: 1.2850}, {end: 257, value: 1.2849}, {end: 265, value: 1.2848}, >+ {end: 273, value: 1.2847}, {end: 283, value: 1.2846}, {end: 292, value: 1.2845}, {end: 303, value: 1.2844}, >+ {end: 314, value: 1.2843}, {end: 326, value: 1.2842}, {end: 339, value: 1.2841}, {end: 353, value: 1.2840}, >+ {end: 369, value: 1.2839}, {end: 385, value: 1.2838}, {end: 404, value: 1.2837}, {end: 424, value: 1.2836}, >+ {end: 446, value: 1.2835}, {end: 471, value: 1.2834}, {end: 499, value: 1.2833}, {end: 530, value: 1.2832}, >+ {end: 565, value: 1.2831}, {end: 606, value: 1.2830}, {end: 652, value: 1.2829}, {end: 707, value: 1.2828}, >+ {end: 771, value: 1.2827}, {end: 848, value: 1.2826}, {end: 942, value: 1.2825}, {end: 1060, value: 1.2824}, >+ {end: 1212, value: 1.2823}, {end: 1415, value: 1.2822}, {end: 1699, value: 1.2821}, {end: 2125, value: 1.2820}, >+ {end: 2837, value: 1.2819}, {end: 4266, value: 1.2818}, {end: 8601, value: 1.2817}, {end: Infinity, value: 1.2816} >+ ], > 0.95: [ >- 6.313752, 2.919986, 2.353363, 2.131847, 2.015048, 1.943180, 1.894579, 1.859548, 1.833113, 1.812461, >- 1.795885, 1.782288, 1.770933, 1.761310, 1.753050, 1.745884, 1.739607, 1.734064, 1.729133, 1.724718, >- 1.720743, 1.717144, 1.713872, 1.710882, 1.708141, 1.705618, 1.703288, 1.701131, 1.699127, 1.697261, >- 1.695519, 1.693889, 1.692360, 1.690924, 1.689572, 1.688298, 1.687094, 1.685954, 1.684875, 1.683851, >- 1.682878, 1.681952, 1.681071, 1.680230, 1.679427, 1.678660, 1.677927, 1.677224, 1.676551, 1.675905, >- >- 1.675285, 1.674689, 1.674116, 1.673565, 1.673034, 1.672522, 1.672029, 1.671553, 1.671093, 1.670649, >- 1.670219, 1.669804, 1.669402, 1.669013, 1.668636, 1.668271, 1.667916, 1.667572, 1.667239, 1.666914, >- 1.666600, 1.666294, 1.665996, 1.665707, 1.665425, 1.665151, 1.664885, 1.664625, 1.664371, 1.664125, >- 1.663884, 1.663649, 1.663420, 1.663197, 1.662978, 1.662765, 1.662557, 1.662354, 1.662155, 1.661961, >- 1.661771, 1.661585, 1.661404, 1.661226, 1.661052, 1.660881, 1.660715, 1.660551, 1.660391, 1.660234], >+ {end: 1, value: 6.3138}, {end: 2, value: 2.9200}, {end: 3, value: 2.3534}, {end: 4, value: 2.1318}, >+ {end: 5, value: 2.0150}, {end: 6, value: 1.9432}, {end: 7, value: 1.8946}, {end: 8, value: 1.8595}, >+ {end: 9, value: 1.8331}, {end: 10, value: 1.8125}, {end: 11, value: 1.7959}, {end: 12, value: 1.7823}, >+ {end: 13, value: 1.7709}, {end: 14, value: 1.7613}, {end: 15, value: 1.7531}, {end: 16, value: 1.7459}, >+ {end: 17, value: 1.7396}, {end: 18, value: 1.7341}, {end: 19, value: 1.7291}, {end: 20, value: 1.7247}, >+ {end: 21, value: 1.7207}, {end: 22, value: 1.7171}, {end: 23, value: 1.7139}, {end: 24, value: 1.7109}, >+ {end: 25, value: 1.7081}, {end: 26, value: 1.7056}, {end: 27, value: 1.7033}, {end: 28, value: 1.7011}, >+ {end: 29, value: 1.6991}, {end: 30, value: 1.6973}, {end: 31, value: 1.6955}, {end: 32, value: 1.6939}, >+ {end: 33, value: 1.6924}, {end: 34, value: 1.6909}, {end: 35, value: 1.6896}, {end: 36, value: 1.6883}, >+ {end: 37, value: 1.6871}, {end: 38, value: 1.6860}, {end: 39, value: 1.6849}, {end: 40, value: 1.6839}, >+ {end: 41, value: 1.6829}, {end: 42, value: 1.6820}, {end: 43, value: 1.6811}, {end: 44, value: 1.6802}, >+ {end: 45, value: 1.6794}, {end: 46, value: 1.6787}, {end: 47, value: 1.6779}, {end: 48, value: 1.6772}, >+ {end: 49, value: 1.6766}, {end: 50, value: 1.6759}, {end: 51, value: 1.6753}, {end: 52, value: 1.6747}, >+ {end: 53, value: 1.6741}, {end: 54, value: 1.6736}, {end: 55, value: 1.6730}, {end: 56, value: 1.6725}, >+ {end: 57, value: 1.6720}, {end: 58, value: 1.6716}, {end: 59, value: 1.6711}, {end: 60, value: 1.6706}, >+ {end: 61, value: 1.6702}, {end: 62, value: 1.6698}, {end: 63, value: 1.6694}, {end: 64, value: 1.6690}, >+ {end: 65, value: 1.6686}, {end: 66, value: 1.6683}, {end: 67, value: 1.6679}, {end: 68, value: 1.6676}, >+ {end: 69, value: 1.6672}, {end: 70, value: 1.6669}, {end: 71, value: 1.6666}, {end: 72, value: 1.6663}, >+ {end: 73, value: 1.6660}, {end: 74, value: 1.6657}, {end: 75, value: 1.6654}, {end: 76, value: 1.6652}, >+ {end: 77, value: 1.6649}, {end: 78, value: 1.6646}, {end: 79, value: 1.6644}, {end: 80, value: 1.6641}, >+ {end: 81, value: 1.6639}, {end: 82, value: 1.6636}, {end: 83, value: 1.6634}, {end: 84, value: 1.6632}, >+ {end: 85, value: 1.6630}, {end: 86, value: 1.6628}, {end: 87, value: 1.6626}, {end: 88, value: 1.6624}, >+ {end: 89, value: 1.6622}, {end: 90, value: 1.6620}, {end: 91, value: 1.6618}, {end: 92, value: 1.6616}, >+ {end: 93, value: 1.6614}, {end: 94, value: 1.6612}, {end: 95, value: 1.6611}, {end: 96, value: 1.6609}, >+ {end: 97, value: 1.6607}, {end: 98, value: 1.6606}, {end: 99, value: 1.6604}, {end: 100, value: 1.6602}, >+ {end: 101, value: 1.6601}, {end: 102, value: 1.6599}, {end: 103, value: 1.6598}, {end: 104, value: 1.6596}, >+ {end: 105, value: 1.6595}, {end: 106, value: 1.6594}, {end: 107, value: 1.6592}, {end: 108, value: 1.6591}, >+ {end: 109, value: 1.6590}, {end: 110, value: 1.6588}, {end: 111, value: 1.6587}, {end: 112, value: 1.6586}, >+ {end: 113, value: 1.6585}, {end: 114, value: 1.6583}, {end: 115, value: 1.6582}, {end: 116, value: 1.6581}, >+ {end: 117, value: 1.6580}, {end: 118, value: 1.6579}, {end: 119, value: 1.6578}, {end: 120, value: 1.6577}, >+ {end: 121, value: 1.6575}, {end: 122, value: 1.6574}, {end: 123, value: 1.6573}, {end: 124, value: 1.6572}, >+ {end: 125, value: 1.6571}, {end: 126, value: 1.6570}, {end: 127, value: 1.6569}, {end: 129, value: 1.6568}, >+ {end: 130, value: 1.6567}, {end: 131, value: 1.6566}, {end: 132, value: 1.6565}, {end: 133, value: 1.6564}, >+ {end: 134, value: 1.6563}, {end: 135, value: 1.6562}, {end: 137, value: 1.6561}, {end: 138, value: 1.6560}, >+ {end: 139, value: 1.6559}, {end: 140, value: 1.6558}, {end: 142, value: 1.6557}, {end: 143, value: 1.6556}, >+ {end: 144, value: 1.6555}, {end: 146, value: 1.6554}, {end: 147, value: 1.6553}, {end: 148, value: 1.6552}, >+ {end: 150, value: 1.6551}, {end: 151, value: 1.6550}, {end: 153, value: 1.6549}, {end: 154, value: 1.6548}, >+ {end: 156, value: 1.6547}, {end: 158, value: 1.6546}, {end: 159, value: 1.6545}, {end: 161, value: 1.6544}, >+ {end: 163, value: 1.6543}, {end: 164, value: 1.6542}, {end: 166, value: 1.6541}, {end: 168, value: 1.6540}, >+ {end: 170, value: 1.6539}, {end: 172, value: 1.6538}, {end: 174, value: 1.6537}, {end: 176, value: 1.6536}, >+ {end: 178, value: 1.6535}, {end: 180, value: 1.6534}, {end: 182, value: 1.6533}, {end: 184, value: 1.6532}, >+ {end: 186, value: 1.6531}, {end: 189, value: 1.6530}, {end: 191, value: 1.6529}, {end: 193, value: 1.6528}, >+ {end: 196, value: 1.6527}, {end: 198, value: 1.6526}, {end: 201, value: 1.6525}, {end: 204, value: 1.6524}, >+ {end: 206, value: 1.6523}, {end: 209, value: 1.6522}, {end: 212, value: 1.6521}, {end: 215, value: 1.6520}, >+ {end: 218, value: 1.6519}, {end: 221, value: 1.6518}, {end: 225, value: 1.6517}, {end: 228, value: 1.6516}, >+ {end: 231, value: 1.6515}, {end: 235, value: 1.6514}, {end: 239, value: 1.6513}, {end: 242, value: 1.6512}, >+ {end: 246, value: 1.6511}, {end: 250, value: 1.6510}, {end: 255, value: 1.6509}, {end: 259, value: 1.6508}, >+ {end: 263, value: 1.6507}, {end: 268, value: 1.6506}, {end: 273, value: 1.6505}, {end: 278, value: 1.6504}, >+ {end: 283, value: 1.6503}, {end: 288, value: 1.6502}, {end: 294, value: 1.6501}, {end: 299, value: 1.6500}, >+ {end: 305, value: 1.6499}, {end: 312, value: 1.6498}, {end: 318, value: 1.6497}, {end: 325, value: 1.6496}, >+ {end: 332, value: 1.6495}, {end: 339, value: 1.6494}, {end: 347, value: 1.6493}, {end: 355, value: 1.6492}, >+ {end: 364, value: 1.6491}, {end: 372, value: 1.6490}, {end: 382, value: 1.6489}, {end: 392, value: 1.6488}, >+ {end: 402, value: 1.6487}, {end: 413, value: 1.6486}, {end: 424, value: 1.6485}, {end: 436, value: 1.6484}, >+ {end: 449, value: 1.6483}, {end: 463, value: 1.6482}, {end: 477, value: 1.6481}, {end: 493, value: 1.6480}, >+ {end: 509, value: 1.6479}, {end: 527, value: 1.6478}, {end: 545, value: 1.6477}, {end: 566, value: 1.6476}, >+ {end: 587, value: 1.6475}, {end: 611, value: 1.6474}, {end: 636, value: 1.6473}, {end: 664, value: 1.6472}, >+ {end: 694, value: 1.6471}, {end: 727, value: 1.6470}, {end: 764, value: 1.6469}, {end: 804, value: 1.6468}, >+ {end: 849, value: 1.6467}, {end: 899, value: 1.6466}, {end: 955, value: 1.6465}, {end: 1019, value: 1.6464}, >+ {end: 1092, value: 1.6463}, {end: 1176, value: 1.6462}, {end: 1274, value: 1.6461}, {end: 1390, value: 1.6460}, >+ {end: 1530, value: 1.6459}, {end: 1700, value: 1.6458}, {end: 1914, value: 1.6457}, {end: 2189, value: 1.6456}, >+ {end: 2555, value: 1.6455}, {end: 3070, value: 1.6454}, {end: 3845, value: 1.6453}, {end: 5142, value: 1.6452}, >+ {end: 7760, value: 1.6451}, {end: 15812, value: 1.6450}, {end: Infinity, value: 1.6449} >+ ], > 0.975: [ >- 12.706205, 4.302653, 3.182446, 2.776445, 2.570582, 2.446912, 2.364624, 2.306004, 2.262157, 2.228139, >- 2.200985, 2.178813, 2.160369, 2.144787, 2.131450, 2.119905, 2.109816, 2.100922, 2.093024, 2.085963, >- 2.079614, 2.073873, 2.068658, 2.063899, 2.059539, 2.055529, 2.051831, 2.048407, 2.045230, 2.042272, >- 2.039513, 2.036933, 2.034515, 2.032245, 2.030108, 2.028094, 2.026192, 2.024394, 2.022691, 2.021075, >- 2.019541, 2.018082, 2.016692, 2.015368, 2.014103, 2.012896, 2.011741, 2.010635, 2.009575, 2.008559, >- >- 2.007584, 2.006647, 2.005746, 2.004879, 2.004045, 2.003241, 2.002465, 2.001717, 2.000995, 2.000298, >- 1.999624, 1.998972, 1.998341, 1.997730, 1.997138, 1.996564, 1.996008, 1.995469, 1.994945, 1.994437, >- 1.993943, 1.993464, 1.992997, 1.992543, 1.992102, 1.991673, 1.991254, 1.990847, 1.990450, 1.990063, >- 1.989686, 1.989319, 1.988960, 1.988610, 1.988268, 1.987934, 1.987608, 1.987290, 1.986979, 1.986675, >- 1.986377, 1.986086, 1.985802, 1.985523, 1.985251, 1.984984, 1.984723, 1.984467, 1.984217, 1.983972], >+ {end: 1, value: 12.7062}, {end: 2, value: 4.3027}, {end: 3, value: 3.1824}, {end: 4, value: 2.7764}, >+ {end: 5, value: 2.5706}, {end: 6, value: 2.4469}, {end: 7, value: 2.3646}, {end: 8, value: 2.3060}, >+ {end: 9, value: 2.2622}, {end: 10, value: 2.2281}, {end: 11, value: 2.2010}, {end: 12, value: 2.1788}, >+ {end: 13, value: 2.1604}, {end: 14, value: 2.1448}, {end: 15, value: 2.1314}, {end: 16, value: 2.1199}, >+ {end: 17, value: 2.1098}, {end: 18, value: 2.1009}, {end: 19, value: 2.0930}, {end: 20, value: 2.0860}, >+ {end: 21, value: 2.0796}, {end: 22, value: 2.0739}, {end: 23, value: 2.0687}, {end: 24, value: 2.0639}, >+ {end: 25, value: 2.0595}, {end: 26, value: 2.0555}, {end: 27, value: 2.0518}, {end: 28, value: 2.0484}, >+ {end: 29, value: 2.0452}, {end: 30, value: 2.0423}, {end: 31, value: 2.0395}, {end: 32, value: 2.0369}, >+ {end: 33, value: 2.0345}, {end: 34, value: 2.0322}, {end: 35, value: 2.0301}, {end: 36, value: 2.0281}, >+ {end: 37, value: 2.0262}, {end: 38, value: 2.0244}, {end: 39, value: 2.0227}, {end: 40, value: 2.0211}, >+ {end: 41, value: 2.0195}, {end: 42, value: 2.0181}, {end: 43, value: 2.0167}, {end: 44, value: 2.0154}, >+ {end: 45, value: 2.0141}, {end: 46, value: 2.0129}, {end: 47, value: 2.0117}, {end: 48, value: 2.0106}, >+ {end: 49, value: 2.0096}, {end: 50, value: 2.0086}, {end: 51, value: 2.0076}, {end: 52, value: 2.0066}, >+ {end: 53, value: 2.0057}, {end: 54, value: 2.0049}, {end: 55, value: 2.0040}, {end: 56, value: 2.0032}, >+ {end: 57, value: 2.0025}, {end: 58, value: 2.0017}, {end: 59, value: 2.0010}, {end: 60, value: 2.0003}, >+ {end: 61, value: 1.9996}, {end: 62, value: 1.9990}, {end: 63, value: 1.9983}, {end: 64, value: 1.9977}, >+ {end: 65, value: 1.9971}, {end: 66, value: 1.9966}, {end: 67, value: 1.9960}, {end: 68, value: 1.9955}, >+ {end: 69, value: 1.9949}, {end: 70, value: 1.9944}, {end: 71, value: 1.9939}, {end: 72, value: 1.9935}, >+ {end: 73, value: 1.9930}, {end: 74, value: 1.9925}, {end: 75, value: 1.9921}, {end: 76, value: 1.9917}, >+ {end: 77, value: 1.9913}, {end: 78, value: 1.9908}, {end: 79, value: 1.9905}, {end: 80, value: 1.9901}, >+ {end: 81, value: 1.9897}, {end: 82, value: 1.9893}, {end: 83, value: 1.9890}, {end: 84, value: 1.9886}, >+ {end: 85, value: 1.9883}, {end: 86, value: 1.9879}, {end: 87, value: 1.9876}, {end: 88, value: 1.9873}, >+ {end: 89, value: 1.9870}, {end: 90, value: 1.9867}, {end: 91, value: 1.9864}, {end: 92, value: 1.9861}, >+ {end: 93, value: 1.9858}, {end: 94, value: 1.9855}, {end: 95, value: 1.9853}, {end: 96, value: 1.9850}, >+ {end: 97, value: 1.9847}, {end: 98, value: 1.9845}, {end: 99, value: 1.9842}, {end: 100, value: 1.9840}, >+ {end: 101, value: 1.9837}, {end: 102, value: 1.9835}, {end: 103, value: 1.9833}, {end: 104, value: 1.9830}, >+ {end: 105, value: 1.9828}, {end: 106, value: 1.9826}, {end: 107, value: 1.9824}, {end: 108, value: 1.9822}, >+ {end: 109, value: 1.9820}, {end: 110, value: 1.9818}, {end: 111, value: 1.9816}, {end: 112, value: 1.9814}, >+ {end: 113, value: 1.9812}, {end: 114, value: 1.9810}, {end: 115, value: 1.9808}, {end: 116, value: 1.9806}, >+ {end: 117, value: 1.9804}, {end: 118, value: 1.9803}, {end: 119, value: 1.9801}, {end: 120, value: 1.9799}, >+ {end: 121, value: 1.9798}, {end: 122, value: 1.9796}, {end: 123, value: 1.9794}, {end: 124, value: 1.9793}, >+ {end: 125, value: 1.9791}, {end: 126, value: 1.9790}, {end: 127, value: 1.9788}, {end: 128, value: 1.9787}, >+ {end: 129, value: 1.9785}, {end: 130, value: 1.9784}, {end: 131, value: 1.9782}, {end: 132, value: 1.9781}, >+ {end: 133, value: 1.9780}, {end: 134, value: 1.9778}, {end: 135, value: 1.9777}, {end: 136, value: 1.9776}, >+ {end: 137, value: 1.9774}, {end: 138, value: 1.9773}, {end: 139, value: 1.9772}, {end: 140, value: 1.9771}, >+ {end: 141, value: 1.9769}, {end: 142, value: 1.9768}, {end: 143, value: 1.9767}, {end: 144, value: 1.9766}, >+ {end: 145, value: 1.9765}, {end: 146, value: 1.9763}, {end: 147, value: 1.9762}, {end: 148, value: 1.9761}, >+ {end: 149, value: 1.9760}, {end: 150, value: 1.9759}, {end: 151, value: 1.9758}, {end: 152, value: 1.9757}, >+ {end: 153, value: 1.9756}, {end: 154, value: 1.9755}, {end: 155, value: 1.9754}, {end: 156, value: 1.9753}, >+ {end: 157, value: 1.9752}, {end: 158, value: 1.9751}, {end: 159, value: 1.9750}, {end: 160, value: 1.9749}, >+ {end: 161, value: 1.9748}, {end: 162, value: 1.9747}, {end: 163, value: 1.9746}, {end: 164, value: 1.9745}, >+ {end: 166, value: 1.9744}, {end: 167, value: 1.9743}, {end: 168, value: 1.9742}, {end: 169, value: 1.9741}, >+ {end: 170, value: 1.9740}, {end: 172, value: 1.9739}, {end: 173, value: 1.9738}, {end: 174, value: 1.9737}, >+ {end: 175, value: 1.9736}, {end: 177, value: 1.9735}, {end: 178, value: 1.9734}, {end: 179, value: 1.9733}, >+ {end: 181, value: 1.9732}, {end: 182, value: 1.9731}, {end: 183, value: 1.9730}, {end: 185, value: 1.9729}, >+ {end: 186, value: 1.9728}, {end: 188, value: 1.9727}, {end: 189, value: 1.9726}, {end: 191, value: 1.9725}, >+ {end: 192, value: 1.9724}, {end: 194, value: 1.9723}, {end: 195, value: 1.9722}, {end: 197, value: 1.9721}, >+ {end: 199, value: 1.9720}, {end: 200, value: 1.9719}, {end: 202, value: 1.9718}, {end: 204, value: 1.9717}, >+ {end: 205, value: 1.9716}, {end: 207, value: 1.9715}, {end: 209, value: 1.9714}, {end: 211, value: 1.9713}, >+ {end: 213, value: 1.9712}, {end: 215, value: 1.9711}, {end: 217, value: 1.9710}, {end: 219, value: 1.9709}, >+ {end: 221, value: 1.9708}, {end: 223, value: 1.9707}, {end: 225, value: 1.9706}, {end: 227, value: 1.9705}, >+ {end: 229, value: 1.9704}, {end: 231, value: 1.9703}, {end: 234, value: 1.9702}, {end: 236, value: 1.9701}, >+ {end: 238, value: 1.9700}, {end: 241, value: 1.9699}, {end: 243, value: 1.9698}, {end: 246, value: 1.9697}, >+ {end: 248, value: 1.9696}, {end: 251, value: 1.9695}, {end: 253, value: 1.9694}, {end: 256, value: 1.9693}, >+ {end: 259, value: 1.9692}, {end: 262, value: 1.9691}, {end: 265, value: 1.9690}, {end: 268, value: 1.9689}, >+ {end: 271, value: 1.9688}, {end: 274, value: 1.9687}, {end: 277, value: 1.9686}, {end: 280, value: 1.9685}, >+ {end: 284, value: 1.9684}, {end: 287, value: 1.9683}, {end: 290, value: 1.9682}, {end: 294, value: 1.9681}, >+ {end: 298, value: 1.9680}, {end: 302, value: 1.9679}, {end: 305, value: 1.9678}, {end: 309, value: 1.9677}, >+ {end: 313, value: 1.9676}, {end: 318, value: 1.9675}, {end: 322, value: 1.9674}, {end: 326, value: 1.9673}, >+ {end: 331, value: 1.9672}, {end: 335, value: 1.9671}, {end: 340, value: 1.9670}, {end: 345, value: 1.9669}, >+ {end: 350, value: 1.9668}, {end: 355, value: 1.9667}, {end: 361, value: 1.9666}, {end: 366, value: 1.9665}, >+ {end: 372, value: 1.9664}, {end: 378, value: 1.9663}, {end: 384, value: 1.9662}, {end: 390, value: 1.9661}, >+ {end: 397, value: 1.9660}, {end: 404, value: 1.9659}, {end: 411, value: 1.9658}, {end: 418, value: 1.9657}, >+ {end: 425, value: 1.9656}, {end: 433, value: 1.9655}, {end: 441, value: 1.9654}, {end: 449, value: 1.9653}, >+ {end: 458, value: 1.9652}, {end: 467, value: 1.9651}, {end: 476, value: 1.9650}, {end: 486, value: 1.9649}, >+ {end: 496, value: 1.9648}, {end: 507, value: 1.9647}, {end: 518, value: 1.9646}, {end: 530, value: 1.9645}, >+ {end: 542, value: 1.9644}, {end: 554, value: 1.9643}, {end: 567, value: 1.9642}, {end: 581, value: 1.9641}, >+ {end: 596, value: 1.9640}, {end: 611, value: 1.9639}, {end: 627, value: 1.9638}, {end: 644, value: 1.9637}, >+ {end: 662, value: 1.9636}, {end: 681, value: 1.9635}, {end: 701, value: 1.9634}, {end: 723, value: 1.9633}, >+ {end: 745, value: 1.9632}, {end: 769, value: 1.9631}, {end: 795, value: 1.9630}, {end: 823, value: 1.9629}, >+ {end: 852, value: 1.9628}, {end: 884, value: 1.9627}, {end: 918, value: 1.9626}, {end: 955, value: 1.9625}, >+ {end: 995, value: 1.9624}, {end: 1038, value: 1.9623}, {end: 1086, value: 1.9622}, {end: 1138, value: 1.9621}, >+ {end: 1195, value: 1.9620}, {end: 1259, value: 1.9619}, {end: 1329, value: 1.9618}, {end: 1408, value: 1.9617}, >+ {end: 1496, value: 1.9616}, {end: 1597, value: 1.9615}, {end: 1712, value: 1.9614}, {end: 1845, value: 1.9613}, >+ {end: 2001, value: 1.9612}, {end: 2185, value: 1.9611}, {end: 2407, value: 1.9610}, {end: 2678, value: 1.9609}, >+ {end: 3019, value: 1.9608}, {end: 3459, value: 1.9607}, {end: 4049, value: 1.9606}, {end: 4882, value: 1.9605}, >+ {end: 6146, value: 1.9604}, {end: 8295, value: 1.9603}, {end: 12754, value: 1.9602}, {end: 27580, value: 1.9601}, >+ {end: Infinity, value: 1.9600} >+ ], > 0.99: [ >- 31.820516, 6.964557, 4.540703, 3.746947, 3.364930, 3.142668, 2.997952, 2.896459, 2.821438, 2.763769, >- 2.718079, 2.680998, 2.650309, 2.624494, 2.602480, 2.583487, 2.566934, 2.552380, 2.539483, 2.527977, >- 2.517648, 2.508325, 2.499867, 2.492159, 2.485107, 2.478630, 2.472660, 2.467140, 2.462021, 2.457262, >- 2.452824, 2.448678, 2.444794, 2.441150, 2.437723, 2.434494, 2.431447, 2.428568, 2.425841, 2.423257, >- 2.420803, 2.418470, 2.416250, 2.414134, 2.412116, 2.410188, 2.408345, 2.406581, 2.404892, 2.403272, >- >- 2.401718, 2.400225, 2.398790, 2.397410, 2.396081, 2.394801, 2.393568, 2.392377, 2.391229, 2.390119, >- 2.389047, 2.388011, 2.387008, 2.386037, 2.385097, 2.384186, 2.383302, 2.382446, 2.381615, 2.380807, >- 2.380024, 2.379262, 2.378522, 2.377802, 2.377102, 2.376420, 2.375757, 2.375111, 2.374482, 2.373868, >- 2.373270, 2.372687, 2.372119, 2.371564, 2.371022, 2.370493, 2.369977, 2.369472, 2.368979, 2.368497, >- 2.368026, 2.367566, 2.367115, 2.366674, 2.366243, 2.365821, 2.365407, 2.365002, 2.364606, 2.364217] >+ {end: 1, value: 31.8205}, {end: 2, value: 6.9646}, {end: 3, value: 4.5407}, {end: 4, value: 3.7469}, >+ {end: 5, value: 3.3649}, {end: 6, value: 3.1427}, {end: 7, value: 2.9980}, {end: 8, value: 2.8965}, >+ {end: 9, value: 2.8214}, {end: 10, value: 2.7638}, {end: 11, value: 2.7181}, {end: 12, value: 2.6810}, >+ {end: 13, value: 2.6503}, {end: 14, value: 2.6245}, {end: 15, value: 2.6025}, {end: 16, value: 2.5835}, >+ {end: 17, value: 2.5669}, {end: 18, value: 2.5524}, {end: 19, value: 2.5395}, {end: 20, value: 2.5280}, >+ {end: 21, value: 2.5176}, {end: 22, value: 2.5083}, {end: 23, value: 2.4999}, {end: 24, value: 2.4922}, >+ {end: 25, value: 2.4851}, {end: 26, value: 2.4786}, {end: 27, value: 2.4727}, {end: 28, value: 2.4671}, >+ {end: 29, value: 2.4620}, {end: 30, value: 2.4573}, {end: 31, value: 2.4528}, {end: 32, value: 2.4487}, >+ {end: 33, value: 2.4448}, {end: 34, value: 2.4411}, {end: 35, value: 2.4377}, {end: 36, value: 2.4345}, >+ {end: 37, value: 2.4314}, {end: 38, value: 2.4286}, {end: 39, value: 2.4258}, {end: 40, value: 2.4233}, >+ {end: 41, value: 2.4208}, {end: 42, value: 2.4185}, {end: 43, value: 2.4163}, {end: 44, value: 2.4141}, >+ {end: 45, value: 2.4121}, {end: 46, value: 2.4102}, {end: 47, value: 2.4083}, {end: 48, value: 2.4066}, >+ {end: 49, value: 2.4049}, {end: 50, value: 2.4033}, {end: 51, value: 2.4017}, {end: 52, value: 2.4002}, >+ {end: 53, value: 2.3988}, {end: 54, value: 2.3974}, {end: 55, value: 2.3961}, {end: 56, value: 2.3948}, >+ {end: 57, value: 2.3936}, {end: 58, value: 2.3924}, {end: 59, value: 2.3912}, {end: 60, value: 2.3901}, >+ {end: 61, value: 2.3890}, {end: 62, value: 2.3880}, {end: 63, value: 2.3870}, {end: 64, value: 2.3860}, >+ {end: 65, value: 2.3851}, {end: 66, value: 2.3842}, {end: 67, value: 2.3833}, {end: 68, value: 2.3824}, >+ {end: 69, value: 2.3816}, {end: 70, value: 2.3808}, {end: 71, value: 2.3800}, {end: 72, value: 2.3793}, >+ {end: 73, value: 2.3785}, {end: 74, value: 2.3778}, {end: 75, value: 2.3771}, {end: 76, value: 2.3764}, >+ {end: 77, value: 2.3758}, {end: 78, value: 2.3751}, {end: 79, value: 2.3745}, {end: 80, value: 2.3739}, >+ {end: 81, value: 2.3733}, {end: 82, value: 2.3727}, {end: 83, value: 2.3721}, {end: 84, value: 2.3716}, >+ {end: 85, value: 2.3710}, {end: 86, value: 2.3705}, {end: 87, value: 2.3700}, {end: 88, value: 2.3695}, >+ {end: 89, value: 2.3690}, {end: 90, value: 2.3685}, {end: 91, value: 2.3680}, {end: 92, value: 2.3676}, >+ {end: 93, value: 2.3671}, {end: 94, value: 2.3667}, {end: 95, value: 2.3662}, {end: 96, value: 2.3658}, >+ {end: 97, value: 2.3654}, {end: 98, value: 2.3650}, {end: 99, value: 2.3646}, {end: 100, value: 2.3642}, >+ {end: 101, value: 2.3638}, {end: 102, value: 2.3635}, {end: 103, value: 2.3631}, {end: 104, value: 2.3627}, >+ {end: 105, value: 2.3624}, {end: 106, value: 2.3620}, {end: 107, value: 2.3617}, {end: 108, value: 2.3614}, >+ {end: 109, value: 2.3610}, {end: 110, value: 2.3607}, {end: 111, value: 2.3604}, {end: 112, value: 2.3601}, >+ {end: 113, value: 2.3598}, {end: 114, value: 2.3595}, {end: 115, value: 2.3592}, {end: 116, value: 2.3589}, >+ {end: 117, value: 2.3586}, {end: 118, value: 2.3584}, {end: 119, value: 2.3581}, {end: 120, value: 2.3578}, >+ {end: 121, value: 2.3576}, {end: 122, value: 2.3573}, {end: 123, value: 2.3570}, {end: 124, value: 2.3568}, >+ {end: 125, value: 2.3565}, {end: 126, value: 2.3563}, {end: 127, value: 2.3561}, {end: 128, value: 2.3558}, >+ {end: 129, value: 2.3556}, {end: 130, value: 2.3554}, {end: 131, value: 2.3552}, {end: 132, value: 2.3549}, >+ {end: 133, value: 2.3547}, {end: 134, value: 2.3545}, {end: 135, value: 2.3543}, {end: 136, value: 2.3541}, >+ {end: 137, value: 2.3539}, {end: 138, value: 2.3537}, {end: 139, value: 2.3535}, {end: 140, value: 2.3533}, >+ {end: 141, value: 2.3531}, {end: 142, value: 2.3529}, {end: 143, value: 2.3527}, {end: 144, value: 2.3525}, >+ {end: 145, value: 2.3523}, {end: 146, value: 2.3522}, {end: 147, value: 2.3520}, {end: 148, value: 2.3518}, >+ {end: 149, value: 2.3516}, {end: 150, value: 2.3515}, {end: 151, value: 2.3513}, {end: 152, value: 2.3511}, >+ {end: 153, value: 2.3510}, {end: 154, value: 2.3508}, {end: 155, value: 2.3506}, {end: 156, value: 2.3505}, >+ {end: 157, value: 2.3503}, {end: 158, value: 2.3502}, {end: 159, value: 2.3500}, {end: 160, value: 2.3499}, >+ {end: 161, value: 2.3497}, {end: 162, value: 2.3496}, {end: 163, value: 2.3494}, {end: 164, value: 2.3493}, >+ {end: 165, value: 2.3492}, {end: 166, value: 2.3490}, {end: 167, value: 2.3489}, {end: 168, value: 2.3487}, >+ {end: 169, value: 2.3486}, {end: 170, value: 2.3485}, {end: 171, value: 2.3484}, {end: 172, value: 2.3482}, >+ {end: 173, value: 2.3481}, {end: 174, value: 2.3480}, {end: 175, value: 2.3478}, {end: 176, value: 2.3477}, >+ {end: 177, value: 2.3476}, {end: 178, value: 2.3475}, {end: 179, value: 2.3474}, {end: 180, value: 2.3472}, >+ {end: 181, value: 2.3471}, {end: 182, value: 2.3470}, {end: 183, value: 2.3469}, {end: 184, value: 2.3468}, >+ {end: 185, value: 2.3467}, {end: 186, value: 2.3466}, {end: 187, value: 2.3465}, {end: 188, value: 2.3463}, >+ {end: 189, value: 2.3462}, {end: 190, value: 2.3461}, {end: 191, value: 2.3460}, {end: 192, value: 2.3459}, >+ {end: 193, value: 2.3458}, {end: 194, value: 2.3457}, {end: 195, value: 2.3456}, {end: 196, value: 2.3455}, >+ {end: 197, value: 2.3454}, {end: 198, value: 2.3453}, {end: 199, value: 2.3452}, {end: 200, value: 2.3451}, >+ {end: 201, value: 2.3450}, {end: 203, value: 2.3449}, {end: 204, value: 2.3448}, {end: 205, value: 2.3447}, >+ {end: 206, value: 2.3446}, {end: 207, value: 2.3445}, {end: 208, value: 2.3444}, {end: 209, value: 2.3443}, >+ {end: 211, value: 2.3442}, {end: 212, value: 2.3441}, {end: 213, value: 2.3440}, {end: 214, value: 2.3439}, >+ {end: 215, value: 2.3438}, {end: 217, value: 2.3437}, {end: 218, value: 2.3436}, {end: 219, value: 2.3435}, >+ {end: 220, value: 2.3434}, {end: 222, value: 2.3433}, {end: 223, value: 2.3432}, {end: 224, value: 2.3431}, >+ {end: 226, value: 2.3430}, {end: 227, value: 2.3429}, {end: 228, value: 2.3428}, {end: 230, value: 2.3427}, >+ {end: 231, value: 2.3426}, {end: 233, value: 2.3425}, {end: 234, value: 2.3424}, {end: 236, value: 2.3423}, >+ {end: 237, value: 2.3422}, {end: 239, value: 2.3421}, {end: 240, value: 2.3420}, {end: 242, value: 2.3419}, >+ {end: 243, value: 2.3418}, {end: 245, value: 2.3417}, {end: 246, value: 2.3416}, {end: 248, value: 2.3415}, >+ {end: 250, value: 2.3414}, {end: 251, value: 2.3413}, {end: 253, value: 2.3412}, {end: 255, value: 2.3411}, >+ {end: 256, value: 2.3410}, {end: 258, value: 2.3409}, {end: 260, value: 2.3408}, {end: 262, value: 2.3407}, >+ {end: 264, value: 2.3406}, {end: 265, value: 2.3405}, {end: 267, value: 2.3404}, {end: 269, value: 2.3403}, >+ {end: 271, value: 2.3402}, {end: 273, value: 2.3401}, {end: 275, value: 2.3400}, {end: 277, value: 2.3399}, >+ {end: 279, value: 2.3398}, {end: 281, value: 2.3397}, {end: 283, value: 2.3396}, {end: 286, value: 2.3395}, >+ {end: 288, value: 2.3394}, {end: 290, value: 2.3393}, {end: 292, value: 2.3392}, {end: 295, value: 2.3391}, >+ {end: 297, value: 2.3390}, {end: 299, value: 2.3389}, {end: 302, value: 2.3388}, {end: 304, value: 2.3387}, >+ {end: 307, value: 2.3386}, {end: 309, value: 2.3385}, {end: 312, value: 2.3384}, {end: 314, value: 2.3383}, >+ {end: 317, value: 2.3382}, {end: 320, value: 2.3381}, {end: 322, value: 2.3380}, {end: 325, value: 2.3379}, >+ {end: 328, value: 2.3378}, {end: 331, value: 2.3377}, {end: 334, value: 2.3376}, {end: 337, value: 2.3375}, >+ {end: 340, value: 2.3374}, {end: 343, value: 2.3373}, {end: 346, value: 2.3372}, {end: 349, value: 2.3371}, >+ {end: 353, value: 2.3370}, {end: 356, value: 2.3369}, {end: 360, value: 2.3368}, {end: 363, value: 2.3367}, >+ {end: 367, value: 2.3366}, {end: 370, value: 2.3365}, {end: 374, value: 2.3364}, {end: 378, value: 2.3363}, >+ {end: 381, value: 2.3362}, {end: 385, value: 2.3361}, {end: 389, value: 2.3360}, {end: 393, value: 2.3359}, >+ {end: 398, value: 2.3358}, {end: 402, value: 2.3357}, {end: 406, value: 2.3356}, {end: 411, value: 2.3355}, >+ {end: 415, value: 2.3354}, {end: 420, value: 2.3353}, {end: 425, value: 2.3352}, {end: 430, value: 2.3351}, >+ {end: 435, value: 2.3350}, {end: 440, value: 2.3349}, {end: 445, value: 2.3348}, {end: 450, value: 2.3347}, >+ {end: 456, value: 2.3346}, {end: 461, value: 2.3345}, {end: 467, value: 2.3344}, {end: 473, value: 2.3343}, >+ {end: 479, value: 2.3342}, {end: 485, value: 2.3341}, {end: 492, value: 2.3340}, {end: 498, value: 2.3339}, >+ {end: 505, value: 2.3338}, {end: 512, value: 2.3337}, {end: 519, value: 2.3336}, {end: 526, value: 2.3335}, >+ {end: 534, value: 2.3334}, {end: 541, value: 2.3333}, {end: 549, value: 2.3332}, {end: 557, value: 2.3331}, >+ {end: 566, value: 2.3330}, {end: 575, value: 2.3329}, {end: 584, value: 2.3328}, {end: 593, value: 2.3327}, >+ {end: 602, value: 2.3326}, {end: 612, value: 2.3325}, {end: 622, value: 2.3324}, {end: 633, value: 2.3323}, >+ {end: 644, value: 2.3322}, {end: 655, value: 2.3321}, {end: 667, value: 2.3320}, {end: 679, value: 2.3319}, >+ {end: 691, value: 2.3318}, {end: 704, value: 2.3317}, {end: 718, value: 2.3316}, {end: 732, value: 2.3315}, >+ {end: 747, value: 2.3314}, {end: 762, value: 2.3313}, {end: 778, value: 2.3312}, {end: 794, value: 2.3311}, >+ {end: 811, value: 2.3310}, {end: 829, value: 2.3309}, {end: 848, value: 2.3308}, {end: 868, value: 2.3307}, >+ {end: 888, value: 2.3306}, {end: 910, value: 2.3305}, {end: 933, value: 2.3304}, {end: 957, value: 2.3303}, >+ {end: 982, value: 2.3302}, {end: 1008, value: 2.3301}, {end: 1036, value: 2.3300}, {end: 1066, value: 2.3299}, >+ {end: 1097, value: 2.3298}, {end: 1130, value: 2.3297}, {end: 1166, value: 2.3296}, {end: 1203, value: 2.3295}, >+ {end: 1243, value: 2.3294}, {end: 1286, value: 2.3293}, {end: 1332, value: 2.3292}, {end: 1381, value: 2.3291}, >+ {end: 1434, value: 2.3290}, {end: 1491, value: 2.3289}, {end: 1553, value: 2.3288}, {end: 1621, value: 2.3287}, >+ {end: 1694, value: 2.3286}, {end: 1775, value: 2.3285}, {end: 1864, value: 2.3284}, {end: 1962, value: 2.3283}, >+ {end: 2070, value: 2.3282}, {end: 2192, value: 2.3281}, {end: 2329, value: 2.3280}, {end: 2484, value: 2.3279}, >+ {end: 2661, value: 2.3278}, {end: 2865, value: 2.3277}, {end: 3103, value: 2.3276}, {end: 3385, value: 2.3275}, >+ {end: 3722, value: 2.3274}, {end: 4135, value: 2.3273}, {end: 4650, value: 2.3272}, {end: 5312, value: 2.3271}, >+ {end: 6194, value: 2.3270}, {end: 7428, value: 2.3269}, {end: 9274, value: 2.3268}, {end: 12344, value: 2.3267}, >+ {end: 18450, value: 2.3266}, {end: 36515, value: 2.3265}, {end: 1754068, value: 2.3264}, {end: Infinity, value: 2.3263} >+ ], > }; >+ > function oneSidedToTwoSidedProbability(probability) { return 2 * probability - 1; } > function twoSidedToOneSidedProbability(probability) { return (1 - (1 - probability) / 2); } > >diff --git a/Websites/perf.webkit.org/public/v3/components/analysis-results-viewer.js b/Websites/perf.webkit.org/public/v3/components/analysis-results-viewer.js >index ecd6e2f4506d240e71583a16b6de6cc97409f1e1..0bc8c286d8c63c8e1c121f30bdc77238812d9a43 100644 >--- a/Websites/perf.webkit.org/public/v3/components/analysis-results-viewer.js >+++ b/Websites/perf.webkit.org/public/v3/components/analysis-results-viewer.js >@@ -506,11 +506,11 @@ AnalysisResultsViewer.TestGroupStackingBlock = class { > startRowIndex() { return this._commitSetIndexRowIndexMap[0].rowIndex; } > endRowIndex() { return this._commitSetIndexRowIndexMap[this._commitSetIndexRowIndexMap.length - 1].rowIndex; } > >- _valuesForCommitSet(testGroup, commitSet) >+ _measurementsForCommitSet(testGroup, commitSet) > { > return testGroup.requestsForCommitSet(commitSet).map((request) => { > return this._analysisResultsView.resultForRequest(request); >- }).filter((result) => !!result).map((result) => result.value); >+ }).filter((result) => !!result); > } > > _computeTestGroupStatus() >@@ -518,9 +518,9 @@ AnalysisResultsViewer.TestGroupStackingBlock = class { > if (!this.isComplete()) > return {label: null, title: null, status: null}; > console.assert(this._commitSetIndexRowIndexMap.length <= 2); // FIXME: Support having more root sets. >- const startValues = this._valuesForCommitSet(this._testGroup, this._commitSetIndexRowIndexMap[0].commitSet); >- const endValues = this._valuesForCommitSet(this._testGroup, this._commitSetIndexRowIndexMap[1].commitSet); >+ const startValues = this._measurementsForCommitSet(this._testGroup, this._commitSetIndexRowIndexMap[0].commitSet); >+ const endValues = this._measurementsForCommitSet(this._testGroup, this._commitSetIndexRowIndexMap[1].commitSet); > const result = this._testGroup.compareTestResults(this._analysisResultsView.metric(), startValues, endValues); >- return {label: result.label, title: result.fullLabel, status: result.status}; >+ return {label: result.label, title: result.fullLabelForMean, status: result.status}; > } > } >diff --git a/Websites/perf.webkit.org/public/v3/components/test-group-results-viewer.js b/Websites/perf.webkit.org/public/v3/components/test-group-results-viewer.js >index 4b2feacbdb01e32cbb001cdad360b50b1b524f96..4dea785df47d63cb97372a575fdccca3bf2ad0af 100644 >--- a/Websites/perf.webkit.org/public/v3/components/test-group-results-viewer.js >+++ b/Websites/perf.webkit.org/public/v3/components/test-group-results-viewer.js >@@ -57,7 +57,8 @@ class TestGroupResultsViewer extends ComponentBase { > element('th', {class: 'metric-direction'}, ''), > element('th', {colspan: 2}, 'Results'), > element('th', 'Averages'), >- element('th', 'Comparison'), >+ element('th', 'Comparison by mean'), >+ element('th', 'Comparison by individual iterations') > ]), > ]), > tests.map((test) => this._buildRowsForTest(testGroup, expandedTests, test, [], maxDepth, 0))]); >@@ -112,7 +113,7 @@ class TestGroupResultsViewer extends ComponentBase { > const entry = valueMap.get(commitSet); > const previousEntry = valueMap.get(previousCommitSet); > >- const comparison = entry && previousEntry ? testGroup.compareTestResults(metric, previousEntry.filteredValues, entry.filteredValues) : null; >+ const comparison = entry && previousEntry ? testGroup.compareTestResults(metric, previousEntry.filteredMeasurements, entry.filteredMeasurements) : null; > const valueLabels = entry.measurements.map((measurement) => measurement ? formatValue(measurement.value, measurement.interval) : '-'); > > const barCell = element('td', {class: 'plot-bar'}, >@@ -120,15 +121,17 @@ class TestGroupResultsViewer extends ComponentBase { > barCell.expandedHeight = +valueLabels.length + 'rem'; > barCells.push(barCell); > >- const significance = comparison && comparison.isStatisticallySignificant ? 'significant' : 'negligible'; >+ const significanceForMean = comparison && comparison.isStatisticallySignificantForMean ? 'significant' : 'negligible'; >+ const significanceForIndividual = comparison && comparison.isStatisticallySignificantForIndividual ? 'significant' : 'negligible'; > const changeType = comparison ? comparison.changeType : null; > return [ > element('th', testGroup.labelForCommitSet(commitSet)), > barCell, > element('td', formatValue(entry.mean, entry.interval)), >- element('td', {class: `comparison ${changeType} ${significance}`}, comparison ? comparison.fullLabel : ''), >+ element('td', {class: `comparison ${changeType} ${significanceForMean}`}, comparison ? comparison.fullLabelForMean : ''), >+ element('td', {class: `comparison ${changeType} ${significanceForIndividual}`}, comparison ? comparison.fullLabelForIndividual : ''), > ]; >- } >+ }; > > this._barGraphCellMap.set(metric, {barGroup, barCells}); > >@@ -166,10 +169,11 @@ class TestGroupResultsViewer extends ComponentBase { > for (const commitSet of commitSets) { > const requests = testGroup.requestsForCommitSet(commitSet); > const measurements = requests.map((request) => resultsView.resultForRequest(request)); >- const filteredValues = measurements.filter((result) => !!result).map((measurement) => measurement.value); >+ const filteredMeasurements = measurements.filter((result) => !!result); >+ const filteredValues = filteredMeasurements.map((measurement) => measurement.value); > const allValues = measurements.map((result) => result != null ? result.value : NaN); > const interval = Statistics.confidenceInterval(filteredValues); >- map.set(commitSet, {requests, measurements, filteredValues, allValues, mean: Statistics.mean(filteredValues), interval}); >+ map.set(commitSet, {requests, measurements, filteredMeasurements, allValues, mean: Statistics.mean(filteredValues), interval}); > } > return map; > } >diff --git a/Websites/perf.webkit.org/public/v3/models/test-group.js b/Websites/perf.webkit.org/public/v3/models/test-group.js >index fa41dda2066da9f80b7bc8e04057bf46fbcd3377..4ca697133c6d51ae0cdc6a74420cd7a52f450b1f 100644 >--- a/Websites/perf.webkit.org/public/v3/models/test-group.js >+++ b/Websites/perf.webkit.org/public/v3/models/test-group.js >@@ -134,25 +134,31 @@ class TestGroup extends LabeledObject { > return this._buildRequests.some(function (request) { return request.isPending(); }); > } > >- compareTestResults(metric, beforeValues, afterValues) >+ compareTestResults(metric, beforeMeasurements, afterMeasurements) > { > console.assert(metric); >+ const beforeValues = beforeMeasurements.map((measurment) => measurment.value); >+ const afterValues = afterMeasurements.map((measurement) => measurement.value); > const beforeMean = Statistics.sum(beforeValues) / beforeValues.length; > const afterMean = Statistics.sum(afterValues) / afterValues.length; > >- var result = {changeType: null, status: 'failed', label: 'Failed', fullLabel: 'Failed', isStatisticallySignificant: false}; >+ const result = {changeType: null, status: 'failed', label: 'Failed', fullLabelForMean: 'Failed', >+ isStatisticallySignificantForMean: false, fullLabelForIndividual: 'Failed', isStatisticallySignificantForIndividual: false, >+ probabilityRangeForMean: [null, null], probabilityRangeForIndividual: [null, null]}; > >- var hasCompleted = this.hasFinished(); >+ const hasCompleted = this.hasFinished(); > if (!hasCompleted) { > if (this.hasStarted()) { > result.status = 'running'; > result.label = 'Running'; >- result.fullLabel = 'Running'; >+ result.fullLabelForMean = 'Running'; >+ result.fullLabelForIndividual = 'Running'; > } else { > console.assert(result.changeType === null); > result.status = 'pending'; > result.label = 'Pending'; >- result.fullLabel = 'Pending'; >+ result.fullLabelForMean = 'Pending'; >+ result.fullLabelForIndividual = 'Pending'; > } > } > >@@ -160,13 +166,23 @@ class TestGroup extends LabeledObject { > const summary = metric.labelForDifference(beforeMean, afterMean, 'better', 'worse'); > result.changeType = summary.changeType; > result.label = summary.changeLabel; >- var isSignificant = Statistics.testWelchsT(beforeValues, afterValues); >- var significanceLabel = isSignificant ? 'significant' : 'insignificant'; >+ >+ const probabilityRangeForMean = Statistics.probabilityRangeForWelchsT(beforeValues, afterValues); >+ const isSignificantForMean = !!probabilityRangeForMean.range[0]; >+ const significanceLabelForMean = isSignificantForMean? `significant with ${(probabilityRangeForMean.range[0] * 100).toFixed()}% probability` : 'insignificant'; >+ result.fullLabelForMean = `${result.label} (${significanceLabelForMean})`; >+ result.isStatisticallySignificantForMean = isSignificantForMean; >+ result.probabilityRangeForMean = probabilityRangeForMean.range; >+ >+ const probabilityRangeForIndividual = Statistics.probabilityRangeForWelchsTFromAggregatedInfo(beforeMeasurements, afterMeasurements); >+ const isSignificantForIndividual = !!probabilityRangeForIndividual.range[0]; >+ const significanceLabelForIndividual = isSignificantForIndividual ? `significant with ${(probabilityRangeForIndividual.range[0] * 100).toFixed()}% probability` : 'insignificant'; >+ result.fullLabelForIndividual = `${result.label} (${significanceLabelForIndividual})`; >+ result.isStatisticallySignificantForIndividual = isSignificantForIndividual; >+ result.probabilityRangeForIndividual = probabilityRangeForIndividual.range; > > if (hasCompleted) >- result.status = isSignificant ? result.changeType : 'unchanged'; >- result.fullLabel = `${result.label} (statistically ${significanceLabel})`; >- result.isStatisticallySignificant = isSignificant; >+ result.status = isSignificantForMean ? result.changeType : 'unchanged'; > } > > return result; >diff --git a/Websites/perf.webkit.org/tools/js/test-group-result-page.js b/Websites/perf.webkit.org/tools/js/test-group-result-page.js >index 285a3e2594aa8ca5b713d9d050a2ea82563c357c..9af21f14ea8d86a08c863102e74df93e6fd52ac0 100644 >--- a/Websites/perf.webkit.org/tools/js/test-group-result-page.js >+++ b/Websites/perf.webkit.org/tools/js/test-group-result-page.js >@@ -23,7 +23,7 @@ class TestGroupResultPage extends MarkupPage { > return global.RemoteAPI.url(`/v3/#/analysis/task/${analysisTask.id()}`); > } > >- _URLForAnalysisTask(testGroup, analysisResultsView) >+ _resultsForTestGroup(testGroup, analysisResultsView) > { > const resultsByCommitSet = new Map; > let maxValue = -Infinity; >@@ -73,9 +73,24 @@ class TestGroupResultPage extends MarkupPage { > }; > > const analysisResultsView = analysisResults.viewForMetric(metric); >- const {resultsByCommitSet, widthForValue} = this._URLForAnalysisTask(testGroup, analysisResultsView); >+ const {resultsByCommitSet, widthForValue} = this._resultsForTestGroup(testGroup, analysisResultsView); > > const tableBodies = []; >+ >+ const beforeResults = resultsByCommitSet.get(requestedCommitSets[0]).filter((result) => !!result); >+ const afterResults = resultsByCommitSet.get(requestedCommitSets[1]).filter((result) => !!result); >+ const comparison = testGroup.compareTestResults(metric, beforeResults, afterResults); >+ const changeStyleClassForMean = `${comparison.isStatisticallySignificantForMean ? comparison.changeType : 'insignificant'}-result`; >+ const changeStyleClassForIndividual = `${comparison.isStatisticallySignificantForIndividual ? comparison.changeType : 'insignificant'}-result`; >+ const caption = this.createElement('caption', `${testGroup.test().name()} - ${metric.aggregatorLabel()}`); >+ >+ tableBodies.push(this.createElement('tbody', {class: 'comparision-table-body'}, [ >+ this.createElement('tr', [this.createElement('td', 'Comparision by Mean'), >+ this.createElement('td', this.createElement('em', {class: changeStyleClassForMean}, comparison.fullLabelForMean))]), >+ this.createElement('tr', [this.createElement('td', 'Comparision by Individual'), >+ this.createElement('td', this.createElement('em', {class: changeStyleClassForIndividual}, comparison.fullLabelForIndividual))]) >+ ])); >+ > for (const commitSet of requestedCommitSets) { > let firstRow = true; > const tableRows = []; >@@ -93,13 +108,6 @@ class TestGroupResultPage extends MarkupPage { > tableBodies.push(this.createElement('tbody', tableRows)); > } > >- const beforeValues = resultsByCommitSet.get(requestedCommitSets[0]).filter((result) => !!result).map((result) => result.value); >- const afterValues = resultsByCommitSet.get(requestedCommitSets[1]).filter((result) => !!result).map((result) => result.value); >- const comparison = testGroup.compareTestResults(metric, beforeValues, afterValues); >- const changeStyleClass = `${comparison.isStatisticallySignificant ? comparison.changeType : 'insignificant'}-result`; >- const caption = this.createElement('caption', [`${testGroup.test().name()} - ${metric.aggregatorLabel()}: `, >- this.createElement('em', {class: changeStyleClass}, comparison.fullLabel)]); >- > return this.createElement('table', {class: 'result-table'}, [caption, tableBodies]); > } > >@@ -144,6 +152,7 @@ class TestGroupResultPage extends MarkupPage { > 'em': { > 'font-weight': 'bold', > 'font-style': 'normal', >+ 'padding-right': '2rem', > }, > 'caption': { > 'font-size': '1.3rem', >@@ -168,6 +177,9 @@ class TestGroupResultPage extends MarkupPage { > 'text-align': 'center', > 'border-collapse': 'collapse', > }, >+ '.comparision-table-body': { >+ 'text-align': 'left', >+ }, > '.result-cell': { > 'min-width': '20rem', > 'position': 'relative', >diff --git a/Websites/perf.webkit.org/unit-tests/statistics-tests.js b/Websites/perf.webkit.org/unit-tests/statistics-tests.js >index d91042212a1bf19a1db7d16b5ec7a301ab63bddd..cf23c2fc13caaa288fec037430cea1311259faa0 100644 >--- a/Websites/perf.webkit.org/unit-tests/statistics-tests.js >+++ b/Websites/perf.webkit.org/unit-tests/statistics-tests.js >@@ -105,25 +105,25 @@ describe('Statistics', function () { > assert.almostEqual(delta(values, 0.95), 3.015, 3); > > // Following values are computed using Excel Online's STDEV and CONFIDENCE.T >- assert.almostEqual(delta([1, 2, 3, 4], 0.8), 1.057159); >- assert.almostEqual(delta([1, 2, 3, 4], 0.9), 1.519090); >- assert.almostEqual(delta([1, 2, 3, 4], 0.95), 2.054260); >+ assert.almostEqual(delta([1, 2, 3, 4], 0.8), 1.057159, 4); >+ assert.almostEqual(delta([1, 2, 3, 4], 0.9), 1.519090, 4); >+ assert.almostEqual(delta([1, 2, 3, 4], 0.95), 2.054260, 4); > >- assert.almostEqual(delta([0.3, 0.06, 0.5], 0.8), 0.2398353); >- assert.almostEqual(delta([0.3, 0.06, 0.5], 0.9), 0.3713985); >- assert.almostEqual(delta([0.3, 0.06, 0.5], 0.95), 0.5472625); >+ assert.almostEqual(delta([0.3, 0.06, 0.5], 0.8), 0.2398353, 4); >+ assert.almostEqual(delta([0.3, 0.06, 0.5], 0.9), 0.3713985, 4); >+ assert.almostEqual(delta([0.3, 0.06, 0.5], 0.95), 0.5472625, 4); > >- assert.almostEqual(delta([-0.3, 0.06, 0.5], 0.8), 0.4361900); >- assert.almostEqual(delta([-0.3, 0.06, 0.5], 0.9), 0.6754647); >- assert.almostEqual(delta([-0.3, 0.06, 0.5], 0.95), 0.9953098); >+ assert.almostEqual(delta([-0.3, 0.06, 0.5], 0.8), 0.4361900, 4); >+ assert.almostEqual(delta([-0.3, 0.06, 0.5], 0.9), 0.6754647, 4); >+ assert.almostEqual(delta([-0.3, 0.06, 0.5], 0.95), 0.9953098, 4); > >- assert.almostEqual(delta([123, 107, 109, 104, 111], 0.8), 5.001167); >- assert.almostEqual(delta([123, 107, 109, 104, 111], 0.9), 6.953874); >- assert.almostEqual(delta([123, 107, 109, 104, 111], 0.95), 9.056490); >+ assert.almostEqual(delta([123, 107, 109, 104, 111], 0.8), 5.001167, 4); >+ assert.almostEqual(delta([123, 107, 109, 104, 111], 0.9), 6.953874, 4); >+ assert.almostEqual(delta([123, 107, 109, 104, 111], 0.95), 9.056490, 4); > >- assert.almostEqual(delta([6785, 7812, 6904, 7503, 6943, 7207, 6812], 0.8), 212.6155); >- assert.almostEqual(delta([6785, 7812, 6904, 7503, 6943, 7207, 6812], 0.9), 286.9585); >- assert.almostEqual(delta([6785, 7812, 6904, 7503, 6943, 7207, 6812], 0.95), 361.3469); >+ assert.almostEqual(delta([6785, 7812, 6904, 7503, 6943, 7207, 6812], 0.8), 212.6155, 4); >+ assert.almostEqual(delta([6785, 7812, 6904, 7503, 6943, 7207, 6812], 0.9), 286.9585, 4); >+ assert.almostEqual(delta([6785, 7812, 6904, 7503, 6943, 7207, 6812], 0.95), 361.3469, 4); > > }); > }); >@@ -236,6 +236,41 @@ describe('Statistics', function () { > }); > }); > >+ describe('probabilityRangeForWelchsTFromAggregatedInfo', () => { >+ function splitSample(sample) { >+ const mid = sample.length / 2; >+ const firstHalf = sample.slice(0, mid); >+ const secondHalf = sample.slice(mid, sample.length); >+ return [firstHalf, secondHalf].map((values) => ({sum: Statistics.sum(values), squareSum: Statistics.squareSum(values), iterationCount: values.length})); >+ } >+ >+ it('should find the t-value of values using Welch\'s t-test', function () { >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example1.A1), splitSample(example1.A2)).t, example1.expectedT, 2); >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example2.A1), splitSample(example2.A2)).t, example2.expectedT, 2); >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example3.A1), splitSample(example3.A2)).t, example3.expectedT, 2); >+ }); >+ >+ it('should find the degreees of freedom using WelchâSatterthwaite equation', function () { >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example1.A1), splitSample(example1.A2)).degreesOfFreedom, >+ example1.expectedDegreesOfFreedom, 2); >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example2.A1), splitSample(example2.A2)).degreesOfFreedom, >+ example2.expectedDegreesOfFreedom, 2); >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example3.A1), splitSample(example3.A2)).degreesOfFreedom, >+ example3.expectedDegreesOfFreedom, 2); >+ }); >+ >+ it('should compute the range of probabilites using the p-value of Welch\'s t-test', function () { >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example1.A1), splitSample(example1.A2)).range[0], example1.expectedRange[0]); >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example1.A1), splitSample(example1.A2)).range[1], example1.expectedRange[1]); >+ >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example2.A1), splitSample(example2.A2)).range[0], example2.expectedRange[0]); >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example2.A1), splitSample(example2.A2)).range[1], example2.expectedRange[1]); >+ >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example3.A1), splitSample(example3.A2)).range[0], example3.expectedRange[0]); >+ assert.almostEqual(Statistics.probabilityRangeForWelchsTFromAggregatedInfo(splitSample(example3.A1), splitSample(example3.A2)).range[1], example3.expectedRange[1]); >+ }); >+ }); >+ > describe('movingAverage', function () { > it('should return the origian values when both forward and backward window size is 0', function () { > assert.deepEqual(Statistics.movingAverage([1, 2, 3, 4, 5], 0, 0), [1, 2, 3, 4, 5]);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 188425
:
346806
|
346818
|
346843
|
347900