Index: tools/perf/metrics/discrepancy_unittest.py |
diff --git a/tools/perf/metrics/discrepancy_unittest.py b/tools/perf/metrics/discrepancy_unittest.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1e41064df138d2b11dfca8d84f2c059716620edc |
--- /dev/null |
+++ b/tools/perf/metrics/discrepancy_unittest.py |
@@ -0,0 +1,91 @@ |
+# Copyright 2013 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. |
+import unittest |
+import random |
+ |
+from metrics import discrepancy |
+ |
+def Relax(samples, iterations=10): |
+ ''' Lloyd relaxation in 1D. Keeps the position of the first and last |
+ sample. |
+ ''' |
+ for _ in xrange(0, iterations): |
+ voronoi_boundaries = [] |
+ for i in xrange(1, len(samples)): |
+ voronoi_boundaries.append((samples[i] + samples[i-1]) * 0.5) |
+ |
+ relaxed_samples = [] |
+ relaxed_samples.append(samples[0]) |
+ for i in xrange(1, len(samples)-1): |
+ relaxed_samples.append( |
+ (voronoi_boundaries[i-1] + voronoi_boundaries[i]) * 0.5) |
+ relaxed_samples.append(samples[-1]) |
+ samples = relaxed_samples |
+ return samples |
+ |
+class DiscrepancyUnitTest(unittest.TestCase): |
+ def testRandom(self): |
+ ''' Generates 10 sets of 10 random samples, computes the discrepancy, |
+ relaxes the samples using Llloyd's algorithm in 1D, and computes the |
+ discrepancy of the relaxed samples. Discrepancy of the relaxed samples |
+ must be less than or equal to the discrepancy of the original samples. |
+ ''' |
+ random.seed(1234567) |
+ for _ in xrange(0, 10): |
+ samples = [] |
+ num_samples = 10 |
+ clock = 0.0 |
+ samples.append(clock) |
+ for _ in xrange(1, num_samples): |
+ clock += random.random() |
+ samples.append(clock) |
+ samples = discrepancy.NormalizeSamples(samples)[0] |
+ d = discrepancy.Discrepancy(samples) |
+ |
+ relaxed_samples = Relax(samples) |
+ d_relaxed = discrepancy.Discrepancy(relaxed_samples) |
+ |
+ self.assertLessEqual(d_relaxed, d) |
+ |
+ def testAnalytic(self): |
+ ''' Computes discrepancy for sample sets with known discrepancy. ''' |
+ interval_multiplier = 100000 |
+ |
+ samples = [1.0/8.0, 3.0/8.0, 5.0/8.0, 7.0/8.0] |
+ d = discrepancy.Discrepancy(samples, interval_multiplier) |
+ self.assertAlmostEquals(round(d, 2), 0.25) |
+ |
+ samples = [0.0, 1.0/3.0, 2.0/3.0, 1.0] |
+ d = discrepancy.Discrepancy(samples, interval_multiplier) |
+ self.assertAlmostEquals(round(d, 2), 0.5) |
+ |
+ samples = discrepancy.NormalizeSamples(samples)[0] |
+ d = discrepancy.Discrepancy(samples, interval_multiplier) |
+ self.assertAlmostEquals(round(d, 2), 0.25) |
+ |
+ time_stamps_a = [0, 1, 2, 3, 5, 6] |
+ time_stamps_b = [0, 1, 2, 3, 5, 7] |
+ time_stamps_c = [0, 2, 3, 4] |
+ time_stamps_d = [0, 2, 3, 4, 5] |
+ d_abs_a = discrepancy.FrameDiscrepancy(time_stamps_a, True, |
+ interval_multiplier) |
+ d_abs_b = discrepancy.FrameDiscrepancy(time_stamps_b, True, |
+ interval_multiplier) |
+ d_abs_c = discrepancy.FrameDiscrepancy(time_stamps_c, True, |
+ interval_multiplier) |
+ d_abs_d = discrepancy.FrameDiscrepancy(time_stamps_d, True, |
+ interval_multiplier) |
+ d_rel_a = discrepancy.FrameDiscrepancy(time_stamps_a, False, |
+ interval_multiplier) |
+ d_rel_b = discrepancy.FrameDiscrepancy(time_stamps_b, False, |
+ interval_multiplier) |
+ d_rel_c = discrepancy.FrameDiscrepancy(time_stamps_c, False, |
+ interval_multiplier) |
+ d_rel_d = discrepancy.FrameDiscrepancy(time_stamps_d, False, |
+ interval_multiplier) |
+ |
+ self.assertLess(d_abs_a, d_abs_b) |
+ self.assertLess(d_rel_a, d_rel_b) |
+ self.assertLess(d_rel_d, d_rel_c) |
+ self.assertEquals(round(d_abs_d, 2), round(d_abs_c, 2)) |