-
Notifications
You must be signed in to change notification settings - Fork 0
/
ForwardAlgorithm.py
56 lines (49 loc) · 2.37 KB
/
ForwardAlgorithm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from helperFunctions import generateEmissionValue, sumAllLogProbailities
import math
def likelihoodOfSequence(forwardTable):
lastIndex = len(forwardTable) - 1
lastCol = forwardTable[lastIndex]
probability = sumAllLogProbailities(lastCol)
return probability
def calculateFirstProbabilies(initialProbabilities, emissionI, emissionD, sequences):
firstCol = [0,0,0,0]
for i in range(4):
initialProb = initialProbabilities[i]
emissionValue = generateEmissionValue(0, i, sequences, emissionI, emissionD)
firstCol[i] = initialProb* emissionValue
return firstCol
def calculateForwardAlgo(initialProbabilities, transitionProbalities, emissionI, emissionD, sequences ):
results = [[0,0,0,0]]
results[0] = calculateFirstProbabilies(initialProbabilities, emissionI, emissionD, sequences)
endLength = len(sequences[0])
for t in range(1, endLength):
currentCol = [0,0,0,0]
for j in range(4):
singleValue = 0
emissionValue = generateEmissionValue(t, j, sequences, emissionI, emissionD)
for i in range(4):
singleValue = singleValue + (results[t-1][i]*transitionProbalities[i][j])
currentCol[j] = singleValue * emissionValue
results.append(currentCol)
return results;
def calculateFirstProbabiliesLog(initialProbabilities, emissionI, emissionD, sequences):
firstCol = [0,0,0,0]
for i in range(4):
initialProb = initialProbabilities[i]
emissionValue = generateEmissionValue(0, i, sequences, emissionI, emissionD)
firstCol[i] = math.log(initialProb) + math.log(emissionValue)
return firstCol
def calculateForwardAlgoLog(initialProbabilities, transitionProbalities, emissionI, emissionD, sequences ):
results = [[0,0,0,0]]
results[0] = calculateFirstProbabiliesLog(initialProbabilities, emissionI, emissionD, sequences)
endLength = len(sequences[0])
for t in range(1, endLength):
currentCol = [0,0,0,0]
for j in range(4):
singleValues = []
emissionValue = generateEmissionValue(t, j, sequences, emissionI, emissionD)
for i in range(4):
singleValues.append(results[t-1][i] + math.log(transitionProbalities[i][j]) + math.log(emissionValue))
currentCol[j] = sumAllLogProbailities(singleValues)
results.append(currentCol)
return results;