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;
def calculateBackwardsAlgoLog(transitionProbalities, emissionI, emissionD, sequences ):    
    results = [[math.log(1),math.log(1),math.log(1),math.log(1)]]
    endLength = len(sequences[0])
    for t in range(1, endLength):
        currentCol = [0,0,0,0]
        for i in range(4):
            singleValues = []
            for j in range(4):
                indexInSequence = endLength - t;
                emissionValue = generateEmissionValue(indexInSequence, j, sequences, emissionI, emissionD)
                singleValues.append((results[0][j]) + math.log(transitionProbalities[i][j]) + math.log(emissionValue))

            finalVal = sumAllLogProbailities(singleValues)
            if finalVal == float("inf") or finalVal == -float("inf") or finalVal == 0:
                print singleValues
                exit(0)
            currentCol[i] = finalVal
        results.insert(0,currentCol)
            
    return results;
def likelihoodOfSequence(forwardTable):
    lastIndex = len(forwardTable) - 1
    lastCol = forwardTable[lastIndex]
    probability = sumAllLogProbailities(lastCol)
    return probability