words = ['', 'the', 'aged', 'bottle', 'flies', 'fast', '']
k = len(words)
T = ['', 'adj', 'adv', 'det', 'n', 'v', '']
cardT = len(T)
a = [[0.0, 0.4, 0.2, 0.2, 0.1, 0.1, 0.0],
[0.0, 0.2, 0.1, 0.0, 0.3, 0.2, 0.2],
[0.0, 0.2, 0.2, 0.1, 0.1, 0.2, 0.2],
[0.0, 0.3, 0.1, 0.0, 0.5, 0.1, 0.0],
[0.0, 0.1, 0.1, 0.1, 0.2, 0.3, 0.2],
[0.0, 0.2, 0.3, 0.1, 0.2, 0.0, 0.2],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]
b = [[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0],
[0.0, 0.1, 0.0, 0.0, 0.0, 0.01, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.1, 0.1, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.1, 0.2, 0.0],
[0.0, 0.1, 0.3, 0.0, 0.01, 0.1,0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]]
b = dict(zip(words,b))
alpha = [None for _ in range(k)]
alpha[0] = b[""]
for t in range(1,k-1):
alpha[t] = [sum([alpha[t-1][i] * a[i][j] for i in range(cardT)])*b[words[t]][j] for j in range(cardT)]
beta = [None for _ in range(k-1)]
beta[0] = [x[-1] for x in a]
words.reverse()
for t in range(1,k-1):
beta[t] = [sum([ beta[t-1][j]*a[i][j]*b[words[t]][j] for j in range(cardT)]) for i in range(cardT)]
beta.reverse()
words.reverse()
alphabeta = [[x*y for (x,y) in zip(xs,ys)] for (xs,ys) in zip(alpha,beta)]
gamma = [[entry/sum(entries) for entry in entries] for entries in alphabeta]
for group in gamma:
print group