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