Wacky_rubia

Veterby algorythm

May 11th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.21 KB | None | 0 0
  1. def read_state_table(lines):
  2.     states_transition = {}
  3.     states_order = []
  4.     for i in lines[0]:
  5.         if i != ' ' and i != '\t':
  6.             states_order.append(i)
  7.     for row in lines[1:]:
  8.         cells = [cell for cell in row.split() if cell != '']
  9.         states_transition[cells[0]] = {}
  10.         for idx, cell in enumerate(cells[1:]):
  11.             states_transition[cells[0]][states_order[idx]] = float(cell)
  12.     return states_transition
  13.  
  14. def read_letter_table(lines):
  15.     letter_emission = {}
  16.     letter_order = []
  17.     for i in lines[0]:
  18.         if i != ' ' and i != '\t':
  19.             letter_order.append(i)
  20.             letter_emission[i] = {}
  21.     for row in lines[1:]:
  22.         cells = [cell for cell in row.split() if cell != '']
  23.         for idx, cell in enumerate(cells[1:]):
  24.             letter_emission[letter_order[idx]][cells[0]] = float(cell)
  25.     return letter_emission
  26.  
  27. s = []
  28.  
  29. def states_sequence_probability_first(first_letter, transitions_table, emission_table):
  30.     s.append({})
  31.     s[0][0] = 1
  32.     for k in transitions_table:
  33.         s[0][k] = emission_table[first_letter][k] * 1 / len(transitions_table)
  34.  
  35. def states_sequence_probability(string, transitions_table, emission_table):
  36.     states_sequence_probability_first(string[0], transitions_table, emission_table)
  37.     for i in range(1, len(string)):
  38.         s.append({})
  39.         for k in transitions_table:
  40.             sum = 0
  41.             for l in transitions_table:
  42.                 sum += s[i-1][l]*transitions_table[l][k]
  43.             s[i][k] = emission_table[string[i]][k]*sum
  44.     sum = 0
  45.     for k in transitions_table:
  46.         sum += s[len(string) - 1][k]
  47.     return sum
  48.  
  49. def read_file(filename):
  50.     file = ''
  51.     with open(filename) as f:
  52.         file = f.read()
  53.     lines = file.split('\n')
  54.     string = lines[0]
  55.     letters = [x for x in lines[2].split('\t') if x != '']
  56.     transitions_table = read_state_table(lines[6:6 + len(letters)])
  57.     emission_table = read_letter_table(lines[6 + len(letters) + 1:])
  58.     return string, transitions_table, emission_table
  59.  
  60. string, transitions_table, emission_table = read_file('rosalind_ba10d.txt')
  61. print(states_sequence_probability(string, transitions_table, emission_table))
Advertisement
Add Comment
Please, Sign In to add comment