in resources/perf.webkit.org/public/shared/statistics.js [546:578]
function splitIntoSegmentsUntilGoodEnough(values, BirgeAndMassartC) {
if (values.length < 2)
return [0, values.length];
var matrix = new SampleVarianceUpperTriangularMatrix(values);
var SchwarzCriterionBeta = Math.log1p(values.length - 1) / values.length;
BirgeAndMassartC = BirgeAndMassartC || 2.5; // Suggested by the authors.
var BirgeAndMassartPenalization = function (segmentCount) {
return segmentCount * (1 + BirgeAndMassartC * Math.log1p(values.length / segmentCount - 1));
}
var segmentation;
var minTotalCost = Infinity;
var maxK = Math.min(50, values.length);
for (var k = 1; k < maxK; k++) {
var start = Date.now();
var result = findOptimalSegmentation(values, matrix, k);
var cost = result.cost / values.length;
var penalty = SchwarzCriterionBeta * BirgeAndMassartPenalization(k);
if (cost + penalty < minTotalCost) {
minTotalCost = cost + penalty;
segmentation = result.segmentation;
} else
maxK = Math.min(maxK, k + 3);
if (Statistics.debuggingSegmentation)
console.log('splitIntoSegmentsUntilGoodEnough', k, Date.now() - start, cost + penalty);
}
return segmentation;
}