-
- #
-
- import random
-
-
-
- def dot(l, r):
- if len(l) != len(r): raise size_mismatch
- s = 0
- for k in range(len(l)): s += l[k] * r[k]
- return s
-
- class InvalidValue: pass
-
-
-
-
-
- class mutater:
- def __init__(s, p, mu, length):
- if not 0 < mu < 1: raise InvalidValue
- if not len(p) > 0: raise InvalidValue
- pass
-
-
-
-
-
-
-
-
- mu = .1
- k = 3
- l = 200
-
- class LengthMismatch: pass
-
- class pvector:
- def __init__(s, weights=[], keys=False):
- if keys == False: keys = range(len(weights))
- elif len(keys) != len(weights): raise LengthMismatch
-
- s._sum = float(sum(weights))
- s._w = [w/s._sum for w in weights]
- s._k = keys
- s._ub = [w for w in s._w]
- for k in range(1, len(s._w)): s._ub[k] += s._ub[k-1]
-
- def sample(s, n=1): return [s.single_sample() for k in range(n)]
-
- def single_sample(s):
- r = random.random()
- k = 0
- while not r < s._ub[k]: k += 1
- return k
-
- def mean(s): return dot(s._w, s._k)
-
- p = pvector(weights = [.2, .3, 0, .5])
- v = p.sample(n=2000)
-
- print 'mean =', p.mean()
- print 'or... ', sum(v)/float(len(v))
-
-
-
- def distr(mu, size):
- r = size
-
- U = [(1-mu)**(r*u)*(1-(1-mu)**r)**int(u < l) for u in range(r+1)]
- K = [mu*(1-mu)**k/(1-(1-mu)**r) for k in range(r)]
-
-
-
- pass
-
-
- distr(mu=.5, size=5)
-
-