1import math 2 3def logsumexp(lnv): 4 """Sum exp(item) for item in lnv (log-normal vector) without overflow.""" 5 n = lnv[0] 6 maxAbs = n 7 minN = n 8 maxN = n 9 c = n 10 for item in lnv[1:]: 11 n = item 12 if n > maxN: 13 maxN = n 14 if abs(n) > maxAbs: 15 maxAbs = abs(n) 16 if n < minN: 17 minN = n 18 if maxAbs > maxN: 19 c = minN 20 else: 21 c = maxN 22 return c + math.log(sum([math.exp(i - c) for i in lnv])) 23 24