def distance(screen1, screen2, weights): """ Compute the distance between two screens (from Newman et al. 2010). :param screen screen1: First screen :param screen screen2: Second screen :param array weights: weights :returns: The distance score between 0 and 1 """ sum1 = 0.0 for c1 in screen1.cocktails: mini = 100000000 for c2 in screen2.cocktails: distance = metric.distance(c1, c2, weights) if mini > distance: mini = distance sum1 += mini sum2 = 0.0 for c1 in screen2.cocktails: mini = 100000000 for c2 in screen1.cocktails: distance = metric.distance(c1, c2, weights) if mini > distance: mini = distance sum2 += mini score = ( (sum1/float(len(screen1))) + (sum2/float(len(screen2))) )/2.0 return score
def internal_similarity(s, weights): """ Compute the internal diversity within a screen (from Newman et al. 2010). :param screen s: The screen :param array weights: weights :returns: The diversity score between 0 and 1 """ sum_avg = 0 for c1 in s.cocktails: isum = 0 n = 0 for c2 in s.cocktails: isum += metric.distance(c1, c2, weights) n += 1 sum_avg += isum / n return sum_avg / len(s)