Package haizea :: Package common :: Module stats
[hide private]
[frames] | no frames]

Source Code for Module haizea.common.stats

  1  # -------------------------------------------------------------------------- # 
  2  # Copyright 2006-2009, University of Chicago                                 # 
  3  # Copyright 2008-2009, Distributed Systems Architecture Group, Universidad   # 
  4  # Complutense de Madrid (dsa-research.org)                                   # 
  5  #                                                                            # 
  6  # Licensed under the Apache License, Version 2.0 (the "License"); you may    # 
  7  # not use this file except in compliance with the License. You may obtain    # 
  8  # a copy of the License at                                                   # 
  9  #                                                                            # 
 10  # http://www.apache.org/licenses/LICENSE-2.0                                 # 
 11  #                                                                            # 
 12  # Unless required by applicable law or agreed to in writing, software        # 
 13  # distributed under the License is distributed on an "AS IS" BASIS,          # 
 14  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   # 
 15  # See the License for the specific language governing permissions and        # 
 16  # limitations under the License.                                             # 
 17  # -------------------------------------------------------------------------- # 
 18   
 19  import random 
 20  import operator  
 21   
 22  TESTDIST_NUM_ITERS=10000 
 23   
24 -class DiscreteDistributionBase(object):
25 - def __init__(self, values, probabilities):
26 self.values = values 27 self.probabilities = probabilities[:] 28 self.accumprobabilities = probabilities[:] 29 accum = 0.0 30 for i, prob in enumerate(self.probabilities): 31 accum += prob 32 self.accumprobabilities[i] = accum 33 self.numValues = len(self.values)
34
35 - def getAvg(self):
36 return reduce(operator.add, [x[0]*x[1] for x in zip(self.values, self.probabilities)])
37
38 - def getValueFromProb(self, prob):
39 pos = None 40 for i, p in enumerate(self.accumprobabilities): 41 if prob < p: 42 pos = i 43 break #Ugh 44 return self.values[pos]
45
46 - def testDistribution(self):
47 vals = [] 48 histogram = {} 49 for v in self.values: 50 histogram[v]=0 51 for i in xrange(1,TESTDIST_NUM_ITERS): 52 v = self.get() 53 vals.append(v) 54 histogram[v] += 1 55 56 for k in histogram: 57 histogram[k] = float(histogram[k]) / float(TESTDIST_NUM_ITERS) 58 59 print histogram
60 61 62
63 -class DiscreteDistribution(DiscreteDistributionBase):
64 - def __init__(self, values, probabilities):
65 DiscreteDistributionBase.__init__(self, values, probabilities)
66
67 - def get(self):
68 return self.getValueFromProb(random.random())
69 70
71 -class DiscreteUniformDistribution(DiscreteDistributionBase):
72 - def __init__(self, values):
73 probabilities= [1.0/len(values)] * len(values) 74 DiscreteDistributionBase.__init__(self, values, probabilities)
75
76 - def get(self):
77 return self.getValueFromProb(random.random())
78 79
80 -class ContinuousDistributionBase(object):
81 - def __init__(self, min, max):
82 self.min = float(min) 83 self.max = float(max)
84
85 - def getList(self, n):
86 l = [] 87 for i in xrange(1, n): 88 l.append(self.get()) 89 return l
90
91 -class ContinuousUniformDistribution(ContinuousDistributionBase):
92 - def __init__(self, min, max):
94
95 - def get(self):
96 return random.uniform(self.min, self.max)
97
98 -class ContinuousNormalDistribution(ContinuousDistributionBase):
99 - def __init__(self, min, max, mu, sigma):
100 ContinuousDistributionBase.__init__(self, min, max) 101 self.mu = mu 102 self.sigma = sigma
103
104 - def get(self):
105 valid = False 106 while not valid: 107 number = random.normalvariate(self.mu, self.sigma) 108 if number >= self.min and number <= self.max: 109 valid = True 110 return number
111
112 -class ContinuousParetoDistribution(ContinuousDistributionBase):
113 - def __init__(self, min, max, alpha):
114 ContinuousDistributionBase.__init__(self, min, max) 115 self.alpha = alpha
116
117 - def get(self):
118 return random.paretovariate(self.alpha)
119