-
-
-
- import math
-
-
-
-
-
- class size_mismatch: pass
-
-
-
-
-
- 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
-
- def scale(v, a):
- for k in range(len(v)): v[k] *= a
- return v
-
- def mapto01(a, b): return lambda x: (b-a)*x+a
-
- def splitrange(a, b, n):
- dx = float(b-a)/n
- for k in range(n):
- yield (a, a+dx)
- a += dx
- pass
-
- def nintegrate(f, a, b):
- if b == a: return 0
- if (b-a) < 0: -return nintegrate(f, b, a)
- if (b-a) > .25: return sum([nintegrate(f, l, r) for l, r in splitrange(a, b, 2*(b-a))])
-
- x = [-math.sqrt(1/3.), 0, math.sqrt(1/3.)]
- w = [5/9., 8/9., 5/9.]
- F = map(lambda x: f((b-a)/2.*x+(a+b)/2.)*(b-a)/2., x)
-
- return dot(w,F)
-
-
-
-
-
- class populationvector:
- """
-
- """
- def __init__(s, p, size=0):
- r = len(p)
- s._size = size
- s._hash = {}
- for k in p: s[k] += 1./r
- def __getitem__(s, k):
- if k in s._hash: return s._hash[k]
- else: return 0
- def __setitem__(s, k, v):
- if k < 0 or k >= s._size: raise IndexError
- if v == 0:
- if k in s._hash: del s._hash[k]
- else: s._hash[k] = v
- def __repr__(s): return str([s[k] for k in range(s._size)])
- def __len__(s): return s._size
- def __iter__(s):
- for k in range(s._size): yield s[k]
-
-
-
-
-
- def proportional(p, i, f=lambda x: 1): return f(i) / sum([ f(x) for x in p ]) * len(filter(lambda k: k == i, p))
- def dproportional(p, f=lambda x: 1, size=False):
- if size == False: l = max(p)+1
- else: l = size
- v = [0]*l
- for x in p: v[x] += f(x)
- v = scale(v, 1./sum([ f(x) for x in p ]))
- return v
-
-
-
-
-
- def ranked(p, i, f=lambda x: x, q=lambda x: 1):
- p = sorted(p)
- r, j = len(p), 0
-
- for k in range(len(p)):
- if i == p[k]:
- j = float(k)
- break
-
- return len(filter(lambda x: x == i, p)) * nintegrate(q, j/r, (j+1)/r)
-
- def dranked(p, size, f=lambda x: x, q=lambda x: 1):
- return [ranked(p, i=k, f=f, q=q) for k in range(size)]