blob: f65a82cb96752262b41b4f213af474685bb3aba3 [file] [log] [blame]
# Copyright (c) 2012 The Chromium OS 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 math
def average(l):
return float(sum(l)) / len(l)
def variance(l):
avg = average(l)
return sum([(v - avg)**2 for v in l]) / len(l)
def row_class(iteration):
if iteration % 2 == 0:
return "even_row"
return "odd_row"
def binomial_pmf(k, n, p):
# Compute Pr(X == k) if X ~ binomial(n, p)
choices = math.factorial(n)
choices /= math.factorial(k)
choices /= math.factorial(n - k)
return choices * p**k * (1.0 - p)**(n - k)
def sign_test(x, y):
# First, see how often x was ranked better than y
w = sum([1 for x_val, y_val in zip(x, y) if x_val < y_val])
# Next, count the number on non-ties, tied votes should not count
n = sum([1 for x_val, y_val in zip(x, y) if x_val != y_val])
# Compute the probability of doing even better for H_0: Pr(X < Y) = 0.5
# p_value: Pr(W >= w) ie: the probability of seeing this or more extreme
p_value = sum([binomial_pmf(i, n, 0.5) for i in range(w, n + 1)])
return p_value
def encode_property(prop):
""" Return an encoded version of a property by merging it's encoded
name and value with the hex value for the : character (3a)
NAME:VALUE
"""
return "%s3a%s" % (prop.name.encode("hex"), prop.value.encode("hex"))
def encode_treatment(treatment, properties):
""" Return an encoded version of a treatment by merging it's encoded
properties with the hex value for the , character (0x2c)
PROPERTY 1,PROPERTY 2, PROPERTY 3
"""
return "2c".join([encode_property(p) for p in properties
if p.parent_key() == treatment.key()])
def encode_experiment(experiment, treatments, properties):
""" Return an encoded version of an experiment by merging it's encoded
treatments with the hex value for the + character (0x2b)
TREATMENT 1+TREATMENT 2+TREATMENT 3
"""
return "2b".join([encode_treatment(t, properties) for t in treatments])