Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Unified Diff: tracing/tracing/base/piecewise_linear_function.html

Issue 1908513002: Add mutator utilization metric. (Closed) Base URL: https://github.com/catapult-project/catapult.git@master
Patch Set: Remove redundant semicolon Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tracing/trace_viewer.gypi ('k') | tracing/tracing/base/piecewise_linear_function_test.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tracing/tracing/base/piecewise_linear_function.html
diff --git a/tracing/tracing/base/piecewise_linear_function.html b/tracing/tracing/base/piecewise_linear_function.html
new file mode 100644
index 0000000000000000000000000000000000000000..9ed89349f69eb1e7d28403dd39458217c3207418
--- /dev/null
+++ b/tracing/tracing/base/piecewise_linear_function.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<!--
+Copyright 2016 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/base/base.html">
+
+<script>
+'use strict';
+
+tr.exportTo('tr.b', function() {
+ var PERCENTILE_PRECISION = 1e-7;
+ /**
+ * A function that consists of linear pieces.
+ * See https://en.wikipedia.org/wiki/Piecewise_linear_function.
+ * @constructor
+ */
+ function PiecewiseLinearFunction() {
+ this.pieces = [];
+ }
+
+ PiecewiseLinearFunction.prototype = {
+ /**
+ * Push a linear piece defined by linear interpolation between.
+ * (x1, y1) and (x2, y2).
+ * Pieces must be pushed in the order of increasing x coordinate.
+ */
+ push: function(x1, y1, x2, y2) {
+ if (x1 >= x2)
+ throw new Error('Invalid segment');
+ if (this.pieces.length > 0 &&
+ this.pieces[this.pieces.length - 1].x2 > x1) {
+ throw new Error('Potentially overlapping segments');
+ }
+ if (x1 < x2)
+ this.pieces.push(new Piece(x1, y1, x2, y2));
+ },
+
+ /**
+ * Returns the size of the set A such that for all x in A: f(x) < y.
+ */
+ partBelow: function(y) {
+ return this.pieces.reduce((acc, p) => (acc + p.partBelow(y)), 0);
+ },
+
+ get min() {
+ return this.pieces.reduce((acc, p) => Math.min(acc, p.min), Infinity);
+ },
+
+ get max() {
+ return this.pieces.reduce((acc, p) => Math.max(acc, p.max), -Infinity);
+ },
+
+ get average() {
+ var weightedSum = 0;
+ var totalWeight = 0;
+ this.pieces.forEach(function(piece) {
+ weightedSum += piece.width * piece.average;
+ totalWeight += piece.width;
+ });
+ if (totalWeight === 0)
+ return 0;
+ return weightedSum / totalWeight;
+ },
+
+ /**
+ * Returns the minimum possible value y such that the percentage of x points
+ * that have f(x) <= y is approximately equal to the given |percent|.
+ */
+ percentile: function(percent) {
+ if (!(percent >= 0 && percent <= 1))
+ throw new Error('percent must be [0,1]');
+ var lower = this.min;
+ var upper = this.max;
+ var total = this.partBelow(upper);
+ if (total === 0)
+ return 0;
+ while (upper - lower > PERCENTILE_PRECISION) {
+ var middle = (lower + upper) / 2;
+ var below = this.partBelow(middle);
+ if (below / total < percent)
+ lower = middle;
+ else
+ upper = middle;
+ }
+ return (lower + upper) / 2;
+ }
+ };
+
+ /**
+ * A linear segment from (x1, y1) to (x2, y2).
+ * @constructor
+ */
+ function Piece(x1, y1, x2, y2) {
+ this.x1 = x1;
+ this.y1 = y1;
+ this.x2 = x2;
+ this.y2 = y2;
+ }
+
+ Piece.prototype = {
+ /**
+ * The total length of all x points such that f(x) < y.
+ * More formally:
+ * max(x2 - x1) such that for all x in [x1 .. x2]: f(x) < y.
+ */
+ partBelow: function(y) {
+ var width = this.width;
+ if (width === 0)
+ return 0;
+ var minY = this.min;
+ var maxY = this.max;
+ if (y >= maxY)
+ return width;
+ if (y < minY)
+ return 0;
+ return (y - minY) / (maxY - minY) * width;
+ },
+
+ get min() {
+ return Math.min(this.y1, this.y2);
+ },
+
+ get max() {
+ return Math.max(this.y1, this.y2);
+ },
+
+ get average() {
+ return (this.y1 + this.y2) / 2;
+ },
+
+ get width() {
+ return this.x2 - this.x1;
+ }
+ };
+
+ return {
+ PiecewiseLinearFunction: PiecewiseLinearFunction
+ };
+});
+</script>
« no previous file with comments | « tracing/trace_viewer.gypi ('k') | tracing/tracing/base/piecewise_linear_function_test.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698